JPA зачем использовать createNamedQuery - PullRequest
14 голосов
/ 07 мая 2009

Я нахожусь в процессе изменения моего уровня DAO с использования Hibernate API на использование чистой реализации JPA API. Похоже, рекомендуемый метод - использовать createNamedQuery из менеджера сущностей. Именованные запросы хранятся в аннотациях в классах модели / сущности. Это просто не имеет смысла для меня. Почему вы определяете JPA-запросы в модельных объектах, но используете их в DAO. Разве не имеет смысла просто использовать createQuery из самого DAO и определять запросы в DAO или даже просто определять именованные запросы в самом DAO?

Для тех из вас, кто реализовал свой уровень DAO с использованием API JPA, как вы определили свои запросы?

Ответы [ 5 ]

13 голосов
/ 07 мая 2009

Я использую именованные запросы.

Для этого есть две причины:

  1. Он помещает их в более центральное место, а не разбросано по коду при случайных вызовах createQuery (); и
  2. Процессы сборки могут проверять запросы (очень полезно).
11 голосов
/ 21 мая 2009

Вы можете взглянуть на Spring Data JPA . Это позволяет вам просто определить интерфейс и выполнять запросы без необходимости выполнять выполнение вручную.

Организация:

@Entity
@NamedQuery(id="User.findByLastname" query="from User u where u.lastname = ?1")
public class User implements Persistable<Long> {

  @Id
  private Long id;
  private String username;
  private String lastname;
  private int age;
}

Repository:

public interface UserRepository extends CrudRepository<User, Long> {

  // Will trigger the NamedQuery due to a naming convention
  List<User> findByLastname(String lastname);

  // Will create a query from the methodname
  // from User u where u.username = ?
  User findByUsername(String username);

  // Uses query annotated to the finder method in case you
  // don't want to pollute entity with query info
  @Query("from User u where u.age > ?1")
  List<User> findByAgeGreaterThan(int age);
}

Установка:

EntityManager em = Persistence.getEntityManagerFactory().createEntityManager();
JpaRepositoryFactory factory = new JpaRepositoryFactory(em);

UserRepository repository = factory.getRepository(UserRepository.class);

Как видите, вы можете выбирать между различными способами получения запроса, который будет выполнен из метода. Хотя получение его непосредственно из имени метода возможно для простых запросов, вы, вероятно, выбрали бы между @NamedQuery (стандарт JPA) или @Query (аннотация Spring Data JPA), в зависимости от того, насколько вы предпочитаете придерживаться стандартов.

Spring Data JPA предоставляет вам поддержку в различных других аспектах реализации уровня доступа к данным, позволяет предоставлять собственные реализации для методов и прекрасно интегрируется с Spring.

6 голосов
/ 07 мая 2009

У меня был опыт, совершенно противоположный тому, что был в Клетусе - я не нашел никакой пользы, а также обнаружил, что им неудобно пользоваться. Тривиальные запросы не будут иметь никакого значения, где их определять, но нетривиальные запросы обычно трудно связать с какой-либо одной сущностью, но легко с бизнес-ориентированным методом.

Если вы используете более или менее сложную инфраструктуру в DAO (для повторного использования и согласованности), то использование именованных запросов, как правило, усложняет как реализацию, так и удобочитаемость без видимых преимуществ.

Проверка запросов по процессу сборки звучит интересно - я хотел бы узнать больше о том, что это на самом деле означает ... Мои запросы оставляют небольшое поле для ошибок, поскольку каждый метод DAO проходит модульное тестирование настолько, насколько это имеет смысл.

2 голосов
/ 27 августа 2009

Охватите мощь и :) Если у вас есть запрос, который имеет смысл включить в модель, сделайте это. Если нет, не надо. Возможно, даже лучше спросить: «Почему вы пишете DAO с JPS?» Если ответ «изолировать мой код от базы данных». Это делается библиотекой, реализующей JPA. Если ответ «изолировать мой код от изменений в том, как я сохраняю вещи», то JPA делает это, позволяя вам иметь различные реализации. Я использую объекты запросов для сложных запросов и по-прежнему использую именованные запросы, где это возможно, и мне нравится тот факт, что именованные запросы компилируются, и поэтому я нахожу в них ошибки гораздо быстрее. У меня нет слоя DAO.

2 голосов
/ 07 мая 2009

Не просто используйте именованные запросы везде, есть случаи, когда они не подходят, например, когда это будут редко используемые запросы, тогда он может быть более эффективным, если будет построен по мере необходимости.

Именованные запросы имеют больше смысла, когда они будут сложными и часто выполняемыми.

[Обновлено]

Вместо этого вы можете написать именованные запросы при отображении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...