КАК использовать HAVING COUNT (*) со спящим режимом

Мне нужно создать запрос, и мне нужны COUNT(*) и HAVING 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

Это код, в котором я использую класс Projection 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, запрос сработает, но я не получу фильтр HAVING COUNT(*) в SQL...

В основном запрос пытается получить в схеме «основной-подробности» все основные записи, в которых одновременно присутствует список деталей, например, если вы хотите знать, «какие счета-фактуры имеют оба продукта, A и B».

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

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


person Nicolas400    schedule 22.12.2011    source источник
comment
Извините, я понял проблему. Я заменяю класс CusotmProjections на: .размер()); String[] псевдоним = новая строка[1]; псевдоним [0] = ensayo_id; Type[] types = новый Type[1]; типы [0] = Hibernate.INTEGER; и магия находится на groupby String.   -  person Nicolas400    schedule 22.12.2011


Ответы (4)


Я понял проблему. Я заменяю класс 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 String. –

person Nicolas400    schedule 28.12.2011

Если кому-то нужно сделать это в 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

person Milev    schedule 30.10.2014

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

Мой 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();
person Pasha GR    schedule 17.05.2017

критерии.добавить(Restrictions.sqlRestriction("1=1 имея count(*) = 2"));

person Ickhyun Kwon    schedule 02.12.2015