2014-01-21 37 views
0

我有兩個類:映射結果提出異議

public class User { 
    String name; 
    String surname; 
} 

public class ValueDto { 
    User user; 
    Integer value; 
} 

我的查詢代碼:

String queryText = "SELECT DISTINCT a.* AS user, b.value AS value FROM TABLE_A a, TABLE_B b"; 
SQLQuery sqlQuery = aSession.createSQLQuery(queryTxt); 
sqlQuery.addScalar("value", IntegerType.INSTANCE); 
sqlQuery.setResultTransformer(Transformers.aliasToBean(ValueDto.class)); 
return sqlQuery.list(); 

的問題是獲取* AS用戶,其中用戶是另一個類。我嘗試了addEntity方法,addScalar和其他我不記得的東西,也試圖在Internet上找到解決方案,但沒有成功。我完全不知道如何使它工作。任何幫助將不勝感激。

回答

1

您可以使用構造查詢,像你這樣的投影查詢,直接映射到結果對象:

List<MyClass> dtos = session.createQuery("SELECT NEW com.example.MyClass(e.name, e.data) FROM Entity e").list(); 

MyClass可以是POJO。它需要有一個具有適當參數的公共構造函數。這意味着,你可能將無法使用SELECT a.*,但必須使用明確的列名,像a.name

編輯:有一個20參數的構造函數肯定是醜陋的,使用Transformer是一個可行的選擇,尤其是對使用原生SQL,因爲它不支持NEW運算符。

+0

好的,但訣竅是我不能使用createQuery方法,我必須使用純SQL,所以我猜測唯一的選擇是createSQLQuery方法。另一種情況是,在我的「a」表中有大約20列,所以創建20個字段的POJO,然後將它們全部傳遞給查詢構造器看起來真的很煩人。 – dzuma

+0

使用Hibernate變形金剛可能是您可以使用原生SQL的最佳選擇。 – kostja

+0

沒錯。但通過變壓器,我列出了DTO的所有領域。我想返回一個包含其他對象和其他字段的對象。 – dzuma