NamedQuery:最佳实践

Cli*_*sch 14 java jpa naming-conventions

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

Mik*_*unu 12

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

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

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

正如注释一样,规范使用with而不是by在示例中,并且不使用实体名称作为查询的前缀.但这当然是规范,而不是风格指南.

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

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

  • 我相信`Entity.camelCaseWhatItDoesName`几乎可以作为最佳实践.在过去的项目中,有几个客户采用了这种风格. (2认同)

bre*_*777 5

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

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