2012-07-24 3 views
10

J'ai défini mon ContactDao comme suit:Est-il possible d'ajouter des caractères génériques aux paramètres @Query?

public interface ContactDao extends JpaRepository<Contact, Long> { 

    /** 
    * Finds all contacts that the given user has entered where the contact's full name matches {@code name}. 
    * @param userId The current user's LDAP id. 
    * @param name The name to search for. 
    * @return A list of contacts matching the specified criteria. 
    */ 
    @Query(" select c from Form as f" + 
      " inner join f.contacts as c" + 
      " where f.requestorUserId = :userId" + 
      " and lower(c.fullName) like lower(:name)" + 
      " order by lower(c.fullName)") 
    List<Contact> findUserContactsByUserIdAndName(@Param("userId") String userId, @Param("name") String name); 

} 

Le fonctionne parfaitement au-dessus, et le SQL généré est ce que j'écris moi-même. Le problème est que je voudrais ajouter des wild-cards environnantes au paramètre :name. Y a-t-il un bon moyen de le faire? J'ai regardé le document de référence Spring Data JPA et je ne trouve rien concernant les wildards et @query.

Les travaux de hack, mais est un peu laid:

and lower(c.fullName) like '%' || lower(:name) || '%' 

Quelqu'un at-il une meilleure solution?

Merci, Muel.

+0

Une note légèrement hors-sujet au cas où des auteurs _Spring Data_ sont sur .. :) Peut-être ce genre de fonctionnalité (entourant avec des caractères génériques) pourrait être ajouté à '@ Param'; par exemple '@Param (value =" nom ", wildcardStategy = WildcardStrategy.BOTH)'. Certes, je l'ai très peu réfléchi, donc il y a probablement de forts arguments contre! – Muel

+0

Est-ce vraiment un hack? –

Répondre

3

Je ne l'appellerais pas non plus un hack - c'est la façon dont la syntaxe JPQL est définie exactement pour ces problèmes.

Cependant, il existe une alternative utilisant un CriteriaBuilder/CriteriaQuery, mais peut-être que vous le trouvez encore plus complexe (mais vous obtenez en retour une sécurité de type compilation).

+0

Personnellement, je ne suis pas un grand fan de l'API de critères. Je le trouve plus complexe que JPQL, et moins lisible (même si d'autres ne seront pas d'accord avec moi ici!). Bien qu'il fournisse une sécurité de type à la compilation, il ne garantit pas qu'il s'exécutera bien au moment de l'exécution. Surtout en utilisant Hibernate! La seule fois où je trouve l'API Criteria très utile est la création de requêtes personnalisées basées sur la saisie de l'utilisateur (par exemple un formulaire de recherche). Merci d'avoir répondu! – Muel

Questions connexes