2011-03-24 4 views
21

Je travaille sur une requête de recherche en utilisant HQL et tout fonctionne jusqu'à ce que j'arrive à la clause LIKE. Peu importe ce que je fais, il ne semble pas exécuter correctement la clause LIKE. Voici ma requête.Requête HQL avec LIKE ayant des problèmes

String QUERY = "FROM Person as p WHERE p.createUser = : createUser 
    AND p.personId in (SELECT pn.personId FROM PersonName pn WHERE pn.personNameType = 'FIRST' AND pn.name LIKE '%:firstName%')"; 

(List<Person>)session.createQuery(QUERY).setString("createUser", createUser).setString("firstName", firstName).list(); 

Répondre

46

Les paramètres à l'intérieur des chaînes littérales ne sont pas résolus.

Vous devez ajouter % s aux valeurs des paramètres avec concaténation de chaînes - soit du côté du programme

String QUERY = "FROM Person as p WHERE p.createUser = : createUser 
    AND p.personId in " + 
    "(SELECT pn.personId FROM PersonName pn " + 
    "WHERE pn.personNameType = 'FIRST' " + 
    "AND pn.name LIKE :firstName)"; 

(List<Person>)session.createQuery(QUERY) 
    .setString("createUser", createUser) 
    .setString("firstName", "%" + firstName + "%").list(); 

ou du côté de la base de données:

String QUERY = "FROM Person as p WHERE p.createUser = : createUser 
    AND p.personId in " + 
    "(SELECT pn.personId FROM PersonName pn " + 
    "WHERE pn.personNameType = 'FIRST' " + 
    "AND pn.name LIKE CONCAT('%', :firstName, '%'))"; 

(List<Person>)session.createQuery(QUERY) 
    .setString("createUser", createUser) 
    .setString("firstName", firstName).list(); 
+0

Qu'en est-il de la casse. Y a-t-il un moyen de le rendre insensible à la casse? Merci pour la réponse! @axtavt – medium

+1

cast 'pn.name' et le paramètre' firstName' en minuscule dans votre requête – djmj