У меня есть класс предметной области, который я использую для запросов.
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.
Заранее спасибо.