2011-05-30 10 views
7

JPAを介してSQLネイティブクエリを使用していくつかのデータを選択する際に、いくつか問題があります。私は同じ名前の "descricao"という3つの列を持っているからです。JPAネイティブクエリーを使用して同じ名前の複数の列を選択する方法は?

私のEntityManagerは、最初の列の値をインターフェースのcreateNativeQuery方法を通じて選択操作を実行オーバーライド他人を発見しました。

(たとえば、与えられたレコードの最初の列descricaoの値は、オブジェクトの配列でこの結果を取得すると、「foo」、2番目の「bar」および3番目の「foobar」です。 t ORMはエンティティをマップしています)、与えられた2番目と3番目の列の値で埋めるべき場所は最初の値で埋められます)

私はJPAを選択したのでデータベース上で直接すべてを適切に返します。

環境:

のMySQL5。 EJB 3.0; JPA 1.0; JBoss 5.0.0GA; JDK 1.6;

SQLクエリ:

"select p.id, p.datapedido, b.descricao, prd.descricao, s.nome, 
      usuario.email, cc.chave_cupom, prd.nome, 
      ca.descricao, i.produto_id, i.valoritem, 
      hc.valor_utilizado, tp.datapagamento 
      ..." 

答えて

5

スカラー列マッピング:列マッピングに指定されている今、ネイティブクエリの列の別名を使用して

@SqlResultSetMapping(
     name="DescricaoColumnAlias", 
     columns={@ColumnResult(name="B_DESCRICAO"), 
       @ColumnResult(name="CA_DESCRICAO"), 
       @ColumnResult(name="PRD_DESCRICAO")} 
) 

「B_DESCRICAO、PRD_DESCRICAO、s.nome、usuario.email、cc.chave_cupom、prd.nome、CA_DESCRICAO、私としてca.descricaoとしてprd.descricaoとしてp.id、p.datapedido、b.descricaoを選択します。 "

resultSetMapping &クエリを指定してネイティブクエリーを作成しています。非常に具体的な質問のためのドキュメント(非常に一般的な)へ

entityManager.createNativeQuery(queryString, "DescricaoColumnAlias"); 
+0

ありがとう、完璧な解決策 – Arun

+0

@Arunよろしくお願いします。 –

+0

@Nayanマッピングで指定した列のみがネイティブクエリから返ってきたことから、サンプルはどのように機能しますか? –

1

私はあなたの列がエンティティのプロパティにマップする方法を指定するためにSqlResultSetMappingを使うべきだと思います。

あなたはEclipseLinkのプロジェクトに便利(JPAのリファレンス実装)のこのwikiページを見つけるかもしれない:http://en.wikibooks.org/wiki/Java_Persistence/Querying#Result_Set_Mapping

+0

リンクに有用私見ではありません。関連するセクションを少なくとも引用する必要がありますので、私たちはどのドキュメントを見ているべきかを知っています。 –

0

私はJPAを使用するので、的外れ場合は無視しますが、エンティティがマップされていない場合は、なぜができませんクエリの影響を受けるフィールドにエイリアスを付けずに結果セットにアクセスしますか?エンティティBeanで

select b.descricao AS d1, prd.descricao as d2, ca.descricao as d3... 
-1
@Transactional(readOnly = true) 
@SuppressWarnings("unchecked") 
@Column(name = "status") 

public List<Student> findStudentByStatus(String status) { 
    System.out 
      .println("call findStudentMethd******************with this pattern" 
        + status 
        + "*********************************************"); 

    return em.createQuery(
      "select attendence from Attendence attendence where attendence.status like '" 
        + p 
        + A 
        + L 
        + "'") 

    .getResultList(); 

} 
関連する問題