2014-10-01 29 views
0

我正在使用Dto與一些實體訪問數據庫,並且我希望改進請求而不修改我的dto並刪除提取,因此hibernate不會返回所有數據所有實體(休眠設置爲懶惰),我試着用了下,但it's不工作:在響應參數中使用dot的Hql查詢

StringBuilder hql = new StringBuilder(); 
    hql.append(" select d.id as id, ce.cod as clasification.cod "); 
    hql.append(" from Document d"); 
    hql.append(" join d.clasificacionEntity ce"); 

工作HQL要求:

StringBuilder hql = new StringBuilder(); 
    hql.append(" select d"); 
    hql.append(" from Document d"); 
    hql.append(" join fetch d.clasificacionEntity ce"); 

問題是,當我嘗試使用「ce.cod作爲clasification.cod」第二個點給我一個錯誤,還有其他方法可以做到這一點? , 非常感謝!!!

我的DTO的結果是:

DocumentDto{ 
    private id 
    private clasificacionEntityDto; 
    } 

    And 
clasificacionEntityDto { 
    private cod 
    } 
+0

' clasification.cod'是別名na我爲什麼要在那裏使用點? – Chaitanya 2014-10-01 10:37:05

+0

因爲我需要那樣的視圖界面。 – Gustavo 2014-10-01 10:45:32

+0

什麼是視圖界面?你能否在你的問題中增加更多細節以避免混淆。但仍然使用點作爲別名是不正確的。 – Chaitanya 2014-10-01 10:55:50

回答

0

最後我剛剛創建這樣一個DTO:

DocumentDto{ 
    private id 
    private String clasificacionEntityDtoCod; 
    } 

,並將其設置是這樣的:

StringBuilder hql = new StringBuilder(); 
    hql.append(" select d.id as id, ce.cod as clasificacionEntityDtoCod "); 
    hql.append(" from Document d"); 
    hql.append(" join d.clasificacionEntity ce"); 
1

當你寫這樣的代碼:

hql.append(" select d.id as id, ce.cod as clasification.cod "); 

你告訴的解析器d.id命名idce.cod命名clasification.cod

最後一個別名是錯誤的!正確的名字是clasificationcod

如果你想指出ce.cod的屬性(cod是哪種數據類型?),你可以在提取結果後指向它。

1

您沒有提及如何將查詢結果轉換爲您的DTO實體。一個簡單的解決方案,不需要你改變你的DTO類。

// select only the fields you need from your query 
StringBuilder hql = new StringBuilder(); 
hql.append(" select d.id as id, ce.cod as cod "); 
hql.append(" from Document d"); 
hql.append(" join d.clasificacionEntity ce"); 

// ... etc. Then get back your results as raw type 
List<Object[]> rows = crit.list(); 

然後遍歷結果並手動創建您的DTO。請注意,此示例假定您的文檔具有單一分類。

List<DocumentDTO> documents = new ArrayList<DocumentDTO>(); 
for (Object[] row: rows) { 
    Long id = (Long)row[0]; 
    String cod = (String)row[1]; 
    ClassificationEntityDTO ce = new ClassificationEntityDTO(cod); 
    DocumentDTO d = new DocumentDTO(id, ce); 
    documents.add(d); 
} 

看到這個問題

AliasToBeanResultTransformer(MyDTO.class) fails to instantiate MyDTO