2011-09-29 70 views
4

我正在使用spring-hibernate並使用HibernateDAOSupport類。 我有兩個表以一對多的方式相互映射。 我執行以下標準帶投影的休眠條件不會返回實現條件的實體

DetachedCriteria criteria = getCriteria("a") 
     .setProjection(Projections.projectionList() 
       .add(Projections.groupProperty("a.id")) 
       .add(Projections.count("a.id"), "count") 
       ) 
     .createCriteria("huApps", "hu") 
     .addOrder(Order.desc("count")) 
     ; 

這種運作良好,並創建下面的查詢

select 
     this_.id as y0_, 
     count(this_.id) as y1_ 
    from 
     apps this_ 
    inner join 
     huapps huapp1_ 
      on this_.id=huapp1_.appid 
    group by 
     this_.id 
    order by 
     y1_ desc 

在結果,它返回的object[]列表。但我希望它應該返回List<App>(應用程序是我實現/創建標準的類)。 我希望它會創建查詢

select 
this_ 
    from 
     apps this_ 
    inner join 
     huapps huapp1_ 
      on this_.id=huapp1_.appid 
    group by 
     this_.id 
    order by 
     y1_ desc 

請幫我寫出正確的標準。 我也試過sqlProjection(),但即使這樣也行不通。 有什麼辦法可以做到這一點?

回答

1

您嘗試爲函數detachedCriteria.createCriteria("huApps", "hu")的結果添加新的危機。該函數返回huApp屬性的類的新標準。

嘗試更換標準是這樣的:

DetachedCriteria detachedCriteria = DetachedCriteria.forClass(A.class); 
detachedCriteria.setProjection(Projections.projectionList() 
      .add(Projections.groupProperty("id")) 
      .add(Projections.count("id"), "count") 
    ); 

detachedCriteria.createCriteria("huApps", "hu"); 
detachedCriteria.addOrder(Order.desc("count")); 

List<A> list = detachedCriteria.getExecutableCriteria(getSession()).list(); 

它很適合我。

+0

試過但沒有運氣。 – Rites

+0

再次創建相同的查詢選擇 this_.id如y0_, 計數(this_.id)作爲y1_ 從 ChleonCloudVault.apps THIS_ 內部聯接 ChleonCloudVault.huapps通過huapp1_上this_.id = huapp1_.appid 組 this_.id order by y1_ desc – Rites

+0

如何生成此sql? 這段代碼是'detachedCriteria.getExecutableCriteria(getSession()).list()'返回'List'類的實例,但是我指定了所需類型的泛型 – Yappie

0

嘗試調用

DetachedCriteria criteria = getCriteria("a") 
    .setProjection(Projections.projectionList() 
    .add(Projections.groupProperty("a.id"), "id") 
      .add(Projections.count("a.id"), "count") 
      ) 
    .createCriteria("huApps", "hu") 
    .addOrder(Order.desc("count")) 
    .setResultTransformer(Transformers.aliasToBean(App.class)) 

這應該映射屬性別名到您指定的bean的領域。應用程序將需要在適當的領域的設置和獲得者