14

在 JPA 中创建命名查询时,这些查询的名称(例如等)是否存在公认的最佳实践,并且最好EntityName.allActivefindAllActiveFoos它们查询的实体类中声明这些命名查询或在实用程序类中一起声明这些命名查询?

4

2 回答 2

12

不,没有广泛接受的涵盖任何复杂案例的最佳实践。此外,一般来说,JPA 没有太多可用的样式指南。似乎普遍接受并且通常也用于书籍的方法是从实体名称开始查询。

我会选择 EntityName(以保证持久性单元中的唯一名称)结合操作和参数。

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

请注意,规范在示例中使用with而不是by,并且不使用实体名称作为查询前缀。但这当然是规范,而不是风格指南。

我发现为这些查询名称声明常量然后在 @NamedQuery.name 和 em.createNamedQuery 中使用这些常量是很好的。

因为@NamedQuery、@NamedNativeQuery 和@NamedQueries 只能应用于映射的超类或实体,所以您无法将它们定位到实用程序类。

于 2012-06-07T18:25:46.243 回答
5

尽管似乎没有全球公认的最佳实践,但 Mike Keith 和 Merrick Shincariol 所著的“Pro JPA 2”一书准确地推荐了 Mikko 所说的内容,例如,如果您有一个查找所有员工的查询,则将其称为“Employee.findAll” ”。

Ito 在哪里声明这些,从我所见,再次没有真正的最佳实践。他们似乎倾向于在实体本身上声明它们,而不是在一个大类中声明它们(例如所有实体都从中扩展的基础 MappedSuperclass),因为这很快就会变得单一并且可能有点难以维护。另一种选择是在单独的 XML 文件中声明它们,我不建议这样做。我个人喜欢在与它们相关的实体上声明它们的方法。我也同意 Miko 建议使用常量作为名称,您可以在单独的类中定义所有这些常量。

于 2012-06-08T09:23:01.520 回答