2011-12-22 3 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 ...

В основном запрос пытается получить в схеме master-detail все основные записи, где присутствует список деталей одновременно, например, если вы хотите знать, какие счета-фактуры оба продукта, А и В ".

Вот почему, если у меня есть 3 пункта в статье IN, мне нужно использовать пункт HAVING COUNT = 3.

Любая идея или предложение? С уважением,

+0

К сожалению, я понял, проблема. Я заменяю класс CusotmProjections: .add (Projections.sqlGroupProjection («ensayo_id», groupBy, alias, types)), где groupBy, псевдоним и типы: \t \t \t Строка groupBy = "ensayo_id" + "имеющая" + "count (*) =" + String.valueOf (lineas. размер()); \t \t \t String [] alias = new String [1]; \t \t \t псевдоним [0] = "ensayo_id"; \t \t \t Тип [] type = new Тип [1]; \t \t Категория: [0] = Hibernate.INTEGER; и волшебство находится в группе String. – Nicolas400

ответ

9

Я понял, что проблема. Я заменить класс CusotmProjections с:

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

где группеПо, псевдоним и типы:

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 String. -

1

Если кто-то должен сделать это в Граалей было бы как:

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 имеет счетчик (*) = 2"));

2

Вот мой пример, он отлично работает, может быть полезно:

My SQL запрос:

выберите COLUMN1, сумма (COLUMN2) из ​​my_table группы по 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(); 
Смежные вопросы