Запрос вычисленных полей в GORM - PullRequest
3 голосов
/ 02 января 2011

Я пытаюсь запросить следующий HQL с помощью GORM:

MailMessage.executeQuery("toId, count(toId) from (SELECT  toId, threadId FROM MailMessage as m WHERE receiveStatus = 'u' GROUP BY threadId, toId) as x group by x.toId")

Проблема в том, что count(toId) вычисляемое поле не существует в MailMessage, и я использую подзапрос.

Я получаю следующую ошибку: java.lang.IllegalArgumentException: node to traverse cannot be null! В идеале я хотел бы использовать универсальный executeQuery, который будет возвращать данные любого типа. Есть ли такая вещь?

Ответы [ 3 ]

3 голосов
/ 05 января 2011

Я отвечаю на свой вопрос. Единственный способ сделать это - выполнить сырой SQL и не использовать HQL. К сожалению, я никак не мог понять, как выполнить сложный запрос с подзапросом и вычисляемым полем.

Я использовал пример здесь: Запрос Grails, не использующий GORM

1 голос
/ 07 января 2011

Вы можете решить это также с помощью построителя критериев. Использование groupProperty и countDistinct в Grails Criteria

Эдит: Хорошо, вы должны смешать критерии гибернации с построителем критериев.Для подзапросов вы должны использовать org.hibernate.criterion.DetachedCriteria .

Сначала вы должны создать подзапрос:

 DetachedCriteria avgWeight = DetachedCriteria.forClass(Cat.class)
.setProjection( Property.forName("weight").avg() );

Если я прав, вы можете использовать его в построителе критериев:

Cat.withCriteria{
   and{Subqueries.geAll("weight", weights)}
}
0 голосов
/ 05 января 2011

Непонятно - какой тип данных вы ожидаете получить?

Если вам нужен просто набор данных - список списков значений полей, вам нужно использовать полный синтаксис HQL «select», executeQuery имеет несколько примеров .

Похоже, вы хотели получить коллекцию MailMessage с дополнительным полем countToId. Это нереально просто, если только вы не можете добавить фиктивное поле в MailMessage и написать для него выражение 'select'.

...