jpa присоединяются к запросу на подклассе

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

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

Объект A имеет manyToOne отношения для возражения X. (Примечание, это - односторонние отношения, так возразите X, не видят объект A).

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

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

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

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

Однако это не принимает во внимание подкласс X.. таким образом, я немного потерян.

Любая справка очень ценилась бы.

5
задан Pascal Thivent 2 June 2010 в 16:02
поделиться

2 ответа

Я не тестировал это, но попробуйте что-нибудь вроде этого:

SELECT MAX (a.columnName) FROM A a join a.x WHERE a.x.class = y.class

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

0
ответ дан 18 December 2019 в 13:11
поделиться

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

4.6.17.4 Выражения типа объекта

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

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

 entity_type_expression :: =
type_discriminator |
entity_type_literal |
input_parameter
type_discriminator :: =
ТИП (идентификационная_переменная |
single_valued_object_path_expression |
вход_параметр)

Обозначен entity_type_literal . по названию объекта.

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

Примеры:

 ВЫБРАТЬ e
ОТ Сотрудника e
ГДЕ ТИП (e) IN (Освобожденный, Подрядчик)
ВЫБЕРИТЕ e
ОТ Сотрудника e
ГДЕ ТИП (e) IN (: empType1,: empType2)
ВЫБЕРИТЕ e
ОТ Сотрудника e
ГДЕ ТИП (e) IN: empTypes
ВЫБЕРИТЕ ТИП (e)
ОТ Сотрудника e
ГДЕ ТИП (e) <> Освобожден

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

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

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

 от Cat cat, где cat.class = DomesticCat

В вашем случае я бы попробовал что-то вроде этого:

SELECT MAX(a.columnName) FROM A a where a.x.class = Y
14
ответ дан 18 December 2019 в 13:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: