2011-12-22 68 views
8

我需要創建一個查詢,我需要COUNT(*)HAVING COUNT(*) = x如何使用HAVING COUNT(*)與休眠

我正在使用的工作,使用CustomProjection類,我下載的地方。

這是我嘗試實現SQL:

select count(*) as y0_, this_.ensayo_id as y1_ from Repeticiones this_ 
inner join Lineas linea1_ on this_.linea_id=linea1_.id 
where this_.pesoKGHA>0.0 and this_.nroRepeticion=1 and linea1_.id in (18,24) 
group by this_.ensayo_id 
having count(*) = 2 

這是代碼,我在那裏用Projection休眠類:

critRepeticion.setProjection(Projections.projectionList() 
       .add(Projections.groupProperty("ensayo")) 
       .add(CustomProjections.groupByHaving("ensayo_id",Hibernate.LONG,"COUNT(ensayo_id) = "+String.valueOf(lineas.size())) 
       .add(Projections.rowCount()) 
       ); 

的錯誤是:

!STACK 0 
java.lang.NullPointerException 
at org.hibernate.criterion.ProjectionList.toSqlString(ProjectionList.java:50) 
at org.hibernate.loader.criteria.CriteriaQueryTranslator.getSelect(CriteriaQueryTranslator.java:310) 
at org.hibernate.loader.criteria.CriteriaJoinWalker.<init>(CriteriaJoinWalker.java:71) 
at org.hibernate.loader.criteria.CriteriaLoader.<init>(CriteriaLoader.java:67) 
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1550) 
at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:283) 
at ar.com.cse.cseagro.controller.RepeticionController.buscarEnsayo(RepeticionController.java:101) 

如果我用CustomProjections類評論該行,查詢工作,但我沒有得到t他HAVING COUNT(*)過濾器中的SQL ...

基本上,查詢嘗試檢索,在主 - 細節架構,所有主記錄的細節列表同時存在,如果你想知道「哪些發票有兩種產品,A和B「。

那爲什麼如果我在IN子句中有3個項目,我需要使用HAVING COUNT = 3子句。

任何想法或建議? 此致敬禮,

+0

對不起,我想通了這個問題。我將CusotmProjections類替換爲:.add(Projections。sqlGroupProjection(「ensayo_id」,groupBy,別名,類型)),其中groupBy,別名和類型是:\t \t \t String groupBy =「ensayo_id」+「having」+「count(*)=」+ String.valueOf(lineas。尺寸()); \t \t \t String [] alias = new String [1]; \t \t \t alias [0] =「ensayo_id」; \t \t \t Type [] types = new Type [1]; \t \t \t types [0] = Hibernate.INTEGER;魔術在groupby String上。 – Nicolas400 2011-12-22 15:33:15

回答

9

我想出了問題。我更換CusotmProjections類,具有:

.add(Projections.sqlGroupProjection("ensayo_id", groupBy , alias, types)); 

其中GROUPBY,別名和類型:

String groupBy = "ensayo_id" + " having " + "count(*) = " + String.valueOf(lineas.size()); 
String[] alias = new String[1]; 
Alias[0] = "ensayo_id"; 
Type[] types = new Type[1]; 
types[0] = Hibernate.INTEGER; 

和神奇的是在GROUPBY字符串。 -

1

如果有人需要做它的Grails它會像:

projections { 
    groupProperty("id") 
    sqlGroupProjection(...) 
    rowCount() 
} 

哪裏sqlGroupProjection可自2.2.0

/** 
* Adds a sql projection to the criteria 
* 
* @param sql SQL projecting 
* @param groupBy group by clause 
* @param columnAliases List of column aliases for the projected values 
* @param types List of types for the projected values 
*/ 
protected void sqlGroupProjection(String sql, String groupBy, List<String> columnAliases, List<Type> types) { 
    projectionList.add(Projections.sqlGroupProjection(sql, groupBy, columnAliases.toArray(new String[columnAliases.size()]), types.toArray(new Type[types.size()]))); 
} 

http://grepcode.com/file/repo1.maven.org/maven2/org.grails/grails-hibernate/2.2.0/grails/orm/HibernateCriteriaBuilder.java/#267

0

criteria.add(限制.sqlRestriction(「1 = 1 having count(*)= 2」));

2

這裏是我的樣品,它工作正常,也許有用:

我的SQL查詢:

選擇COLUMN1,從MY_TABLE組總和(COLUMN2)由 其總和COLUMN1(COLUMN2)> 1000 ;

和標準是:

Criteria criteria = getCurrentSession().createCriteria(MyTable.Class); 
    ProjectionList projectionList = Projections.projectionList(); 
    projectionList.add(Projections.property("column1"), "column1"); 
    projectionList.add(Projections.sqlGroupProjection("sum(column2) sumColumn2 ", "COLUMN1 having sum(COLUMN2) > 1000" , new String[]{"sumColumn2"}, new org.hibernate.type.Type[]{StandardBasicTypes.STRING})); 
    criteria.setProjection(projectionList); 
    criteria.List();