NamedQuery: лучшие практики
При создании именованных запросов в JPA существует ли наилучшая практика для имен этих запросов (например, EntityName.allActive
или findAllActiveFoos
и т.д.), и также хорошо объявить эти именованные запросы в классах сущностей, они запрашивают или все вместе в служебном классе?
Ответы
Ответ 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 использовать константы для имени, вы можете просто определить все эти константы в отдельном классе.