2012-06-07 5 views
13

Lors de la création de requêtes nommées dans JPA, existe-t-il une meilleure pratique acceptée pour les noms de ces requêtes (par exemple EntityName.allActive ou findAllActiveFoos etc.) et est-il bon de déclarer ces requêtes nommées dans les classes d'entités ils interrogent ou tous ensemble dans une classe d'utilité?NamedQuery: Meilleures pratiques

+1

Réponse associée: http://stackoverflow.com/a/4948333/1725096 –

Répondre

10

Non, il n'y a pas de meilleure pratique largement acceptée qui couvre tous les cas complexes. En général, il n'y a pas beaucoup de guides de style disponibles pour JPA. Ce qui semble être communément accepté, et généralement utilisé dans les livres, est de lancer une requête avec le nom de l'entité.

J'irais pour EntityName (pour garantir des noms uniques dans l'unité de persistance) combiné avec l'opération et les arguments.

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

Tout comme une note, la spécification utilise with au lieu de by dans les exemples, et ne requête de préfixe avec le nom de l'entité. Mais c'est bien sûr la spécification, pas le guide de style.

Je trouve bon de déclarer des constantes pour ces noms de requêtes, puis d'utiliser ces constantes dans @ NamedQuery.name et em.createNamedQuery. Étant donné que @NamedQuery, @NamedNativeQuery et @NamedQueries ne peuvent être appliqués qu'à une super-classe ou à une entité mappée, vous ne pouvez pas les localiser dans la classe d'utilitaires.

+2

Je crois que 'Entity.camelCaseWhatItDoesName' est une bonne pratique. Dans le passé, plusieurs clients ont adopté ce style. – Kawu

4

Bien qu'il ne semble pas y avoir de meilleure pratique acceptée au niveau mondial, le livre "Pro JPA 2" de Mike Keith et Merrick Shincariol recommande exactement ce que Mikko a dit, par ex. Si vous avez une requête pour trouver tous les employés, appelez-le "Employee.findAll".

Pour les déclarer, encore une fois, il n'y a pas vraiment de meilleure pratique d'après ce que je peux voir. Ils semblent avoir tendance à préférer les déclarer sur l'Entité elle-même plutôt que tous dans une grande classe (comme une base MappedSuperclasse à partir de laquelle s'étendent toutes vos entités) car cela deviendrait très vite monolithique et pourrait être un peu difficile à maintenir. Une autre option consiste à les déclarer dans un fichier XML séparé, pas que je recommanderais cela. Personnellement, j'aime l'approche où ils sont déclarés sur l'Entité à laquelle ils sont liés. Je suis également d'accord avec la suggestion de Miko d'utiliser des constantes pour le nom, vous pouvez simplement définir toutes ces constantes dans une classe séparée.

+0

en aparté, une bonne pratique qui est fortement recommandée pour les requêtes nommées est d'utiliser des paramètres nommés par opposition aux paramètres de position. Cela rend les requêtes beaucoup plus faciles à travailler. – brent777