2016-09-14 69 views
0

我需要把下一個查詢到標準Hibernate的標準GROUP BY和順序按

SELECT DISTINCT SUBSTRING(id, 1, LENGTH(id)-3) AS id_trunc, MAX(version) as version, MAX(code) as code 
FROM theTable 
WHERE (version like '%.%' AND NOT version LIKE '%.0' AND event_code LIKE 'CODE1') OR (version LIKE '%.0' AND code LIKE 'CODE2') 
GROUP BY id_trunc 
ORDER BY id_trunc, version, code 

我有使用標準,但只是簡單的東西的先進經驗,在這種情況下,我需要一種方法做投影,分組依據和排序依據。我嘗試了幾次,但我無法使它工作。我到處尋找,但是對於像這樣複雜的查詢,我找不到任何幫助。

這是我到現在爲止

Criterion whereClause = Restrictions.and(Restrictions.like("version","%.%"), 
          Restrictions.and(Restrictions.not(Restrictions.like("version","%.0")),Restrictions.like("code","CODE1"))); 

    Criterion secondWhere = Restrictions.and(Restrictions.like("Version","%.0"), Restrictions.like("code","CODE2")); 
    LogicalExpression orWhere= Restrictions.or(whereClause,secondWhere); 
    criteria.add(orWhere); 

回答

0

您有限制的部分權利。

所以,來計算你的投影:

criteria.setProjection(Projections.projectionList(). 
    add(Projections.groupProperty("SUBSTRING(id, 1, LENGTH(id)-3)", "id_trunc")). 
    add(Projections.max("version")). 
    add(Projections.max("code"))) 

現在映射你的結果你需要另一個對象,它只能容納三個字段,和變壓器。

criteria.setResultTransformer(Transformers.aliasToBean(TruncatedIdWithMaxVersion.class)) 

而對於ORDER BY:

criteria.addOrder(Order.asc("id_trunc"));