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

NamedQuery: лучшие практики

При создании именованных запросов в JPA существует ли наилучшая практика для имен этих запросов (например, EntityName.allActive или findAllActiveFoos и т.д.), и также хорошо объявить эти именованные запросы в классах сущностей, они запрашивают или все вместе в служебном классе?

4b9b3361

Ответ 1

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

Я бы пошел на EntityName (чтобы гарантировать уникальные имена в модуле сохранения) в сочетании с операциями и аргументами.

  • Person.findByAge
  • Person.findByAgeAndFirstName
  • Person.removeByFirstName
  • Person.updateSalaryIfYearBornBefore

Как примечание, спецификация использует with вместо by в примерах и не префикс запроса с именем объекта. Но это, конечно, спецификация, а не руководство по стилю.

Мне удобно объявлять константы для этих имен запросов, а затем использовать эти константы как в @NamedQuery.name, так и в em.createNamedQuery.

Поскольку @NamedQuery, @NamedNativeQuery и @NamedQueries могут применяться только к сопоставленному суперклассу или сущности, вы не можете найти их в классе утилиты.

Ответ 2

Несмотря на то, что, как представляется, нет лучшей мировой практики, книга "Pro JPA 2" Майка Кейта и Меррика Шинкариола рекомендует именно то, что сказал Микко. если у вас есть запрос на поиск всех сотрудников, тогда назовите его "Employee.findAll".

Ито, где объявить об этом, снова нет реальной лучшей практики из того, что я вижу. Кажется, что они склонны заявлять об этом самим сущностью, а не всем в одном большом классе (например, базовый MappedSuperclass, из которого распространяются все ваши сущности), поскольку это очень быстро станет монолитным и может быть немного сложно поддерживать. Другой вариант - объявить их в отдельном XML файле, а не в том, что я рекомендовал бы это. Лично мне нравится подход, в котором они объявляются в сущности, с которой они связаны. Я также согласен с предложением Miko использовать константы для имени, вы можете просто определить все эти константы в отдельном классе.