2012-06-07 28 views
13

Al crear consultas con nombre en JPA, ¿existe una mejor práctica aceptada por los nombres de estas consultas y también es bueno para declarar estas consultas con nombre en las clases de entidad que (por ejemplo EntityName.allActive o findAllActiveFoos etc.). preguntan o todos juntos en una clase de utilidad?NamedQuery: Mejores prácticas

+1

Respuesta relacionada: http://stackoverflow.com/a/4948333/1725096 –

Respuesta

10

No, no existe una mejor práctica ampliamente aceptada que cubra casos complejos. Además, en general, no hay demasiadas guías de estilo disponibles para JPA. Lo que parece ser comúnmente aceptado, y en general también usado en libros, es comenzar la consulta con el nombre de la entidad.

Iría por EntityName (para garantizar nombres únicos en la unidad de persistencia) combinado con la operación y los argumentos.

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

Así como una nota, la especificación utiliza with en lugar de by en los ejemplos, y no lo hace consulta de prefijo con el nombre de la entidad. Pero eso es, por supuesto, especificación, no guía de estilo.

me resulta bueno para declarar constantes para estos nombres de consulta y luego utilizar estas constantes en ambas @ NamedQuery.name y em.createNamedQuery.

Como @NamedQuery, @NamedNativeQuery y @NamedQueries solo se pueden aplicar a la superclase o entidad asignada, no puede ubicarlas en la clase de utilidad.

+2

Creo que 'Entity.camelCaseWhatItDoesName' prácticamente califica como una buena práctica. En proyectos anteriores, varios clientes han adoptado este estilo. – Kawu

4

Aunque no parece haber una mejor práctica aceptada a nivel mundial, el libro "Pro JPA 2" de Mike Keith y Merrick Shincariol recomienda exactamente lo que dijo Mikko, p. si tiene una consulta para encontrar todos los empleados, llámelo "Employee.findAll".

Ito donde declarar esto, una vez más, no hay una mejor práctica real de lo que puedo ver. Parecen inclinarse a favor de declararlos en la Entidad misma en lugar de en una gran clase (como una BaseSuperclass base a partir de la cual se extienden todas sus entidades), ya que rápidamente se volvería monolítica y podría ser un poco difícil de mantener. Otra opción es declararlos en un archivo XML separado, no es que lo recomiende. Personalmente, me gusta el enfoque donde se declaran en la Entidad con la que están relacionados. También estoy de acuerdo con la sugerencia de Miko de usar constantes para el nombre, podrías simplemente definir todas estas constantes en una clase separada.

+0

como un lado, una mejor práctica que es muy recomendable para consultas con nombre es usar parámetros con nombre en lugar de parámetros posicionales. Esto hace que las consultas sean mucho más fáciles de trabajar. – brent777