如何在hibernate中使用have COUNT(*)

如何在hibernate中使用have COUNT(*),hibernate,having-clause,Hibernate,Having Clause,我需要创建一个查询,我需要COUNT*,并使COUNT*=x 我正在使用一个使用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

我需要创建一个查询,我需要COUNT*,并使COUNT*=x

我正在使用一个使用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
这是我使用投影Hibernate类的代码:

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类对行进行注释,查询将工作,但我没有在SQL中获得HAVING COUNT*过滤器

基本上,查询尝试在主-详细模式中检索同时存在详细信息列表的所有主记录,就像您想知道哪些发票同时包含产品a和产品B一样

这就是为什么如果in子句中有3项,我需要使用HAVING COUNT=3子句

有什么想法或建议吗?
向你问好,

我解决了这个问题。我将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字符串

如果有人需要在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()])));
}

criteria.addRestrictions.sqlRestriction1=1,计数*=2

这是我的示例,它运行良好,可能有用:

我的sql查询:

从MY_表分组依据中选择COLUMN1、sumCOLUMN2 柱1的sumCOLUMN2>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();

对不起,我解决了问题。我将CusotmProjections类替换为:。add Projections.sqlgroupprojectionnsayo_id,groupBy,alias,types,其中groupBy,alias和types是:String groupBy=ensayo_id+having+count*=+String.valueOflineas.size;字符串[]别名=新字符串[1];别名[0]=ensayo_id;类型[]类型=新类型[1];类型[0]=Hibernate.INTEGER;神奇的是groupby字符串。