jpa join запрос на подкласс - PullRequest
5 голосов
/ 02 июня 2010

У меня есть следующие отношения в JPA (hibernate).

Объект X имеет два подкласса, Y и Z.

Объект A имеет отношение manyToOne к объекту X. (Обратите внимание,является односторонним отношением, поэтому объект X не может видеть объект A).

Теперь я хочу получить максимальное значение столбца в объекте A, но только там, где отношение имеет определенный подтип, т.е...Y.

Итак, это равняется ... получить максимальное значение column1 в объекте A во всех экземплярах A, где они связаны с Y. Возможно ли это?Я немного растерялся, как сделать запрос.

Я думал о чем-то вроде:

String query = "SELECT MAX(a.columnName) FROM A a join a.x;
Query query = super.entityManager.createQuery(query);
query.execute();

Однако это не учитывает подкласс X ... так что я немного растерялся.

Любая помощь будет высоко ценится.

Ответы [ 2 ]

14 голосов
/ 02 июня 2010

JPA 2.0 позволяет запросам ограничивать классы, возвращаемые из полиморфного запроса с помощью оператора TYPE. Из спецификации JPA 2.0:

4.6.17.4 Выражения типа сущностей

Можно использовать выражение типа объекта ограничить полиморфизм запросов. Оператор TYPE возвращает точный тип аргумента.

Синтаксис типа сущности Выражение выглядит следующим образом:

entity_type_expression ::=
         type_discriminator |
         entity_type_literal |
         input_parameter
type_discriminator ::=
         TYPE(identification_variable |
                single_valued_object_path_expression |
                input_parameter )

Обозначается entity_type_literal по имени организации.

Используется класс Java объекта в качестве входного параметра для указания тип сущности.

Примеры:

SELECT e
FROM Employee e
WHERE TYPE(e) IN (Exempt, Contractor)

SELECT e
FROM Employee e
WHERE TYPE(e) IN (:empType1, :empType2)

SELECT e
FROM Employee e
WHERE TYPE(e) IN :empTypes

SELECT TYPE(e)
FROM Employee e
WHERE TYPE(e) <> Exempt

JPA 1.0 не предлагает такого механизма, поэтому, если вы используете JPA 1.0, это будет невозможно при использовании стандартного JPQL.

Если вы не возражаете против использования проприетарного HQL, вы можете использовать специальное свойство class:

Аналогично, специальное свойство class обращается к значению дискриминатора экземпляра в случае полиморфной персистентности. Имя класса Java, встроенное в предложение where, будет преобразовано в его значение дискриминатора.

from Cat cat where cat.class = DomesticCat

Так что в вашем случае я бы попробовал что-то подобное:

SELECT MAX(a.columnName) FROM A a where a.x.class = Y
0 голосов
/ 02 июня 2010

Я не проверял это, но попробуйте что-то вроде этого:

ВЫБЕРИТЕ МАКС. (A.columnName) ИЗ А объединения a.x ГДЕ a.x.class = y.class

Надеюсь, это поможет, Anton

...