Подтвердить что ты не робот

Что представляет собой пример реального мира, где более предпочтительным API-интерфейсом JPA2?

Я рассмотрел API критериев JPA 2.0, но я счел его слишком громоздким, в отличие от критериев Hibernate. Есть ли веская причина использовать API критериев JPA 2.0, а не использовать JPA-QL? Спасибо за советы.

4b9b3361

Ответ 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).

См. также

Похожие ответы

Ответ 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.