NamedQuery:最佳做法

2022-09-04 02:42:10

在JPA中创建命名查询时,对于这些查询的名称是否有公认的最佳实践(例如。 或等)而且,在它们查询的实体类中声明这些命名查询还是将它们全部声明在实用程序类中是好的?EntityName.allActivefindAllActiveFoos


答案 1

不,没有广泛接受的涵盖任何复杂案例的最佳实践。此外,一般来说,JPA没有太多的风格指南。似乎普遍接受的,以及书籍中通常使用的,是使用实体的名称开始查询。

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

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

请注意,规范使用而不是示例,并且不会在查询前面加上实体的名称。但这当然是规范,而不是风格指南。withby

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

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


答案 2

虽然似乎没有一个全球公认的最佳实践,但Mike Keith和Merrick Shincariol的“Pro JPA 2”一书推荐了Mikko所说的,例如,如果你对查找所有员工有疑问,那么称之为“Employee.findAll”。

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