JPA SqlResultSetMappingを使用して複数のエンティティを複数のテーブルからの読み取りと移入

StackOverflow https://stackoverflow.com/questions/1292427

質問

私は、DBへのアクセスにJPAを使用してJSFアプリケーションを構築してきました。エンティティの数があります。

私は、テーブル内の複数のエンティティから列を示し、検索結果画面を作成したいです。これらのエンティティは、外部キー関係を持っていません。

これを達成するために、私はEnttityManager.createNativeQueryを使用しているので、同様に、entityMappingグループを指定します:

 Query q = em.createNativeQuery(
     "select t.id as id1, t.bb as bb1, t.cc as cc1," +
     "t2.id as id2, t2.aa as aa2, t2.bb as bb2 " +
     " from table1 t, table2 t2 where t.cc = '22' and t2.id = 2", "TestMapping");

 result = q.getResultList();

TestMappingは、次のようになります:

 @SqlResultSetMapping(name =
 "TestMapping", entities = {
     @EntityResult(entityClass = Table1.class, fields = {
         @FieldResult(name = "id", column = "id1"),
         @FieldResult(name = "bb", column = "bb1"),
         @FieldResult(name = "cc", column = "cc1")}
         ),
     @EntityResult(entityClass = Table2.class, fields = {
         @FieldResult(name = "id", column = "id2"),
         @FieldResult(name = "aa", column = "aa2"),
         @FieldResult(name = "bb", column = "bb2")}
         )
     } )
私はこの小さな例では結構ですが、検索結果には大きなを持っているすべてが4つの事業体、から選択する必要がありますクエリを、内のエンティティの両方からのすべての列名を指定した場合、

この作品列の数。私はentityMappingグループ内のすべての列を指定しない場合は、例外がgetResultList()の呼び出しでスローされます。

私の質問はこれです:それだけではなく、エンティティからのすべてを指定するよりもクエリで選択されているentityMappingグループ内の列を指定することは可能ですか?

役に立ちましたか?

解決

これは、すべてのJPA実装で動作するかどうか、私は知りません。あなたはHibernateを使用している場合は、あなたが怠惰なフェッチタイプを使用してすべてのプロパティをマップすることができます:

@Basic(fetch = FetchType.LAZY)
Date dateCreated;

@Column(length=100)
@Basic(fetch = FetchType.LAZY)
String name;

次に、あなたの分類や、他のそれは怠惰な性質を無視します機器に必要

<target name="instrument" depends="compile">
<taskdef name="instrument" classname="org.hibernate.tool.instrument.InstrumentTask">
    <classpath path="${jar.path}"/>
    <classpath path="${classes.dir}"/>
    <classpath refid="lib.class.path"/>
</taskdef>

<instrument verbose="true">
    <fileset dir="${testclasses.dir}/org/hibernate/auction/model">
        <include name="*.class"/>
    </fileset>
</instrument>

他のヒント

またはあなたはまた、一度「実体」のすべての列を指定するには、を実体* の構文を使用することができます。

Query q = em.createNativeQuery("select t.*, t2.*" + " from table1 t, table2 t2"+
                               "where t.cc = '22' and t2.id = 2", "TestMapping");

そしてTestMappingます:

@SqlResultSetMapping(name = "TestMapping", 
entities = { @EntityResult(entityClass =Table1.class), 
             @EntityResult(entityClass =Table2.class)})
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top