web-dev-qa-db-fra.com

Requête HQL avec LIKE ayant des problèmes

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.

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();
28
medium

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

Vous devez ajouter %s aux valeurs des paramètres avec concaténation de chaînes - soit côté 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 côté 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();
56
axtavt

nous pouvons utiliser plusieurs concaténations pour résoudre ce problème.

SELECT pn.personId FROM PersonName pn WHERE pn.personNameType = 'FIRST' AND pn.name LIKE concat(concat('%", firstName), '%')
0
MR AND