У меня есть следующие отношения в 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.. таким образом, я немного потерян.
Любая справка очень ценилась бы.
Я не тестировал это, но попробуйте что-нибудь вроде этого:
SELECT MAX (a.columnName) FROM A a join a.x WHERE a.x.class = y.class
Надеюсь, это поможет, Антон
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