Я рассмотрел API критериев JPA 2.0, но я счел его слишком громоздким, в отличие от критериев Hibernate. Есть ли веская причина использовать API критериев JPA 2.0, а не использовать JPA-QL? Спасибо за советы.
Что представляет собой пример реального мира, где более предпочтительным API-интерфейсом JPA2?
Ответ 1
Как и API-интерфейс Hibernate, API JPA 2.0 Criteria API особенно хорош для создания запросов динамически, чтобы обрабатывать случаи, когда структура запроса изменяется в зависимости от условий выполнения.
Но есть еще. Хотя он является более подробным, чем API-интерфейс Hibernate, API JPA Criteria API позволяет создавать запросы typesafe (если вы используете Metamodel API). Ниже пример:
EntityManager em = ...
QueryBuilder qb = em.getQueryBuilder();
CriteriaQuery<Person> c = qb.createQuery(Person.class);
Root<Person> p = c.from(Person.class);
Predicate condition = qb.gt(p.get(Person_.age), 20);
c.where(condition);
TypedQuery<Person> q = em.createQuery(c);
List<Person> result = q.getResultList();
В приведенном выше фрагменте ниже будет приведена ошибка компиляции, например:
Predicate condition = qb.gt(p.get(Person_.age, "xyz"));
В случае, если вам интересно, Person_
- это статический, экземплярный, канонический класс метамодели, соответствующий исходному классу сущностей Person
(генерируемый обработчиком аннотаций). Он обеспечивает строго типизированную альтернативу методу отражения на основе времени выполнения:
Field field = Person.class.getField("age");
Плюсы:
- Тип безопасности, проверка времени компиляции!
- Запрещает создание синтаксически неправильных запросов.
- Может возникнуть ошибка компиляции после рефакторинга.
- Предоставляет поддержку автоматической автозагрузки
- Лучше подходит для динамических запросов.
Минусы:
- Более подробный.
- Менее читаемый.
В целом я чувствую себя более комфортно с JPQL, но безопасность типов API Критерии - это основное отличие от JPQL (а также API Hibernate Criteria).
См. также
- Использование API-интерфейсов Criteria и Metamodel API для создания простых запросов типа-типа
- Динамические, типизированные запросы в JPA 2.0
- Сравнение JPQL, критических строковых и типовых запросов
- API запросов API-запросов для JPA
Похожие ответы
Ответ 2
JPA 2.0 Criteria API - это API-интерфейс, основанный на объектах, для построения запросов. Я думаю, что это может сыграть хорошую работу, когда у вас есть динамический запрос, который может стать более читаемым следующим образом
cq.select(...)
.where(...)
.orderBy(...)
.groupBy(...);
Но при использовании запроса статический. Чтобы использовать внешний, поддерживаемый и читаемый файл
<entity-mappings>
...
<named-query name="ORDER">
<query>
<![CDATA[
from
Order
]]>
</query>
</named-query>
<named-query name="ORDER_WITH_LINE_ITEM">
<query>
<![CDATA[
from
Order o
inner join fetch
o.lineItemList
]]>
</query>
</named-query>
...
</entity-mappings>
Если у вас есть модульное приложение, используйте один XML файл для каждого модуля следующим образом
br
com
ar
moduleA
model
repository
moduleA.xml
moduleB
model
repository
moduleB.xml
moduleC
model
repository
moduleC.xml
Затем вы определяете свой элемент mappinf-file
<mapping-file>br/com/ar/moduleA/model/repository/moduleA.xml</mapping-file>
<mapping-file>br/com/ar/moduleB/model/repository/moduleB.xml</mapping-file>
<mapping-file>br/com/ar/moduleC/model/repository/moduleC.xml</mapping-file>
Ответ 3
JPA 2 Критерии могут использоваться в статически типизированной форме, если вы создаете метамодель объекта. Он более подробный, чем JPQL, но статически типизирован и поддерживает динамическую конструкцию запросов напрямую.
Преимущества статически типизированного языка запросов - это то, что вы можете ловить больше ошибок во время компиляции, а также использовать функции IDE, такие как автозаполнение.
Ответ 4
Для меня пример реального мира, где светится JPA2, возникает, когда вам нужно создать запрос на основе ввода от пользователя. Я не говорю о очень простом, где с одним параметром. Я имею в виду, когда вы сделали опцию расширенного поиска в своем приложении. Тот, который требует объединения при заполнении определенного параметра. Вы не хотите объединить свои HQL или SQL для включения большого набора параметров, дополнительных объединений и функций. Пользовательский SQL требует много тестов, чтобы доказать, что он работает. Добавление дополнительных параметров поиска в HQL и SQL требует много повторной работы, тогда как это может быть проще в JPA.