JPA и агрегатные функции. Как использовать результат запроса? - PullRequest
10 голосов
/ 26 мая 2010

Я новичок в ORM, и мне нужна помощь, чтобы что-то понять.

Предположим, у меня есть следующий стандартный запрос SQL:

SELECT *, COUNT(test.testId) AS noTests FROM inspection
LEFT JOIN test ON inspection.inspId = test.inspId
GROUP BY inspection.inspId

, который я хочу использовать в JPA.

У меня есть объект Inspection с отношением один-ко-многим к объекту Test. (инспекция имеет много тестов) Я пытался написать это в JPQL:

Query query = em.createQuery("SELECT insp, COUNT(???what???) " +
      "FROM Inspection insp LEFT JOIN insp.testList " +  
      "GROUP BY insp.inspId");

1) Как мне написать предложение COUNT? Я должен был бы применить count к элементам из тестовой таблицы, но testList - это коллекция, поэтому я не могу сделать что-то вроде COUNT(insp.testList.testId)

2) Предполагая, что 1 решено, какой тип объекта будет возвращен. Это точно не будет объект проверки ... Как мне использовать результат?

1 Ответ

17 голосов
/ 26 мая 2010
  1. Вы можете присвоить псевдоним присоединенной сущности (с помощью AS)
  2. Вы можете создать либо новый объект, либо List с возвращенными значениями

Итак:

SELECT new com.yourproject.ResultHolder(insp, COUNT(test.testId)) 
    FROM Inspection insp LEFT JOIN  insp.testList AS test GROUP BY insp.inspId

Или

SELECT new list(insp, COUNT(test.testId)) 
    FROM Inspection insp LEFT JOIN  insp.testList AS test GROUP BY insp.inspId

Результат затем доступен либо как экземпляр ResultHolder, либо как java.util.List, где insp равно list.get(0), а число равно list.get(1)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...