2009-08-18 71 views
2

我一直在使用JPA構建一個JSF應用程序來訪問數據庫。有一些實體。從多個表中讀取並使用JPA填充多個實體SqlResultSetMapping

我想創建一個搜索結果屏幕,顯示來自表中多個實體的列。這些實體沒有外鍵關係。

爲了實現這一點,我已經使用了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中的列,而不必從實體中指定全部?

回答

0

我不知道這是否適用於所有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> 

0

或者您也可以使用語法實體。*一次性指定「實體」的所有列:

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

And TestMapping:

@SqlResultSetMapping(name = "TestMapping", 
entities = { @EntityResult(entityClass =Table1.class), 
      @EntityResult(entityClass =Table2.class)}) 
相關問題