Вопрос

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

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

Это было полезно?

Решение

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

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

<Ол>
  • Он помещает их в более центральное место, а не разбросано по коду при случайных вызовах createQuery (); и
  • Процессы сборки могут проверять запросы (очень полезно).
  • Другие советы

    Вы могли бы взглянуть на Весенние данные 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;
    }
    

    Хранилище:

    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.

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

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

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

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

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

    [Обновлено]

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

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

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top