NamedQuery:最佳实践

时间:2012-06-07 15:29:48

标签: java jpa naming-conventions

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

2 个答案:

答案 0 :(得分:11)

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

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

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

就像注释一样,规范在示例中使用with而不是by,并且不在查询前加上实体的名称。但这当然是规范,而不是风格指南。

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

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

答案 1 :(得分:4)

虽然似乎没有全球公认的最佳做法,但Mike Keith和Merrick Shincariol所着的“Pro JPA 2”一书却推荐了Mikko所说的,例如:如果您有查询所有员工的查询,请将其命名为“Employee.findAll”。

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