Невозможно получить count и groupBy с Grails DetachedCriteria

У меня есть класс предметной области, который я использую для запросов.

TourIndex{
     Long tourId
     String country
     String location
     int availability
     // ... more fields
}

Мы используем ряд «динамических» построителей критериев для поиска на основе ряда конфигураций, которые в основном приводят к выполнению:

def detachedCriteria = new DetachedCriteria(TourSearchIndex)

detachedCriteria = detachedCriteria.build { eq('country','AR') }
detachedCriteria = detachedCriteria.build { eq('location','salta') }

Я хочу повторно использовать эту логику и получить доступные фильтры с соответствующими результатами в форме

[['location1', '3'], ['location2', '5']]

Моя самая смелая догадка была:

detachedCriteria = detachedCriteria.build{
  projections{
    property('location')
    countDistinct('tourId')
  }
}

Но это приводит к очень очевидной ошибке

Caused by: org.h2.jdbc.JdbcSQLException: Column "THIS_.LOCATION" must be in the GROUP BY list; SQL statement:
select this_.location as y0_, count(distinct this_.tour_id) as y1_ from tour_search_index this_ where this_.country=? [90016-173]

С помощью createCriteria у меня есть способ получить отличный отсчет в соответствии с Как сгруппировать свойство в пункте заказа с помощью критериев Grails

def criteria = TourSearchIndex.createCriteria()

def result = criteria.list {
  projections{
    groupProperty('location')
    countDistinct('id','idDistinct')
  }
  order('idDistinct','desc') 
}

Но я хочу использовать DetachedCriteria, который уже использует остальную часть приложения, есть ли обходной путь для этого? Я думаю, что отсутствует «groupProperty» в DetachedProjection во внутреннем классе DetachedCriteria.

Заранее спасибо.


person Trygve Korssjen    schedule 04.05.2014    source источник


Ответы (2)


Я не уверен, но, увидев ваши критерии и запрос detachedCriteria, а также ошибку, вы можете попробовать это

detachedCriteria = detachedCriteria.build{
  projections{
    groupProperty('location')
    countDistinct('tourId')
  }
}
person Suganthan Madhavan Pillai    schedule 05.05.2014
comment
Спасибо, Сугантан, но это вызывает у меня исключение MissingMethodException. groovy.lang.MissingMethodException: Нет подписи метода: grails.gorm.DetachedCriteria.groupProperty() применимо для типов аргументов: (java.lang.String) значения: [местоположение] Возможные решения: getProperty(java.lang.String), geProperty(java.lang.String, java.lang.String), gtProperty(java.lang.String, java.lang.String), property(java.lang.String), hasProperty(java.lang.String) Как я мог см. внутренние классы DetachedCriteria'n DetachedProjections. Я думаю, что могу поднять jira в проекте grails, если никто не сможет мне помочь. - person Trygve Korssjen; 06.05.2014

Для DetachedCriteria синтаксис немного отличается.

detachedCriteria = detachedCriteria.build{

}.projections{
    property('location')
    countDistinct('tourId')
}.list()
person elixir    schedule 28.07.2017