2010-08-04 17 views
0

J'essaie d'écrire une requête HQL qui sélectionne les lignes d'une table en fonction de plusieurs critères. firstName, lastNameRequête HQL avec plusieurs critères

la prise est que la requête doit être flexible pour ignorer toutes les valeurs vides ou nulles

si

select t from table t where (:firstname = '' or t.firstName = :firstName) AND 
(:lastName = '' OR t.lastName = :lastName) 

J'aurais pensé que cela fonctionnerait? Mais ça ne marche pas - ça ne retourne jamais de lignes? Des idées sur ce qui pourrait mal se passer ici? Je suis très nouveau à HQL c'est pourquoi cette question.

Répondre

2

Si je comprends bien, vous voulez un moyen de permettre à l'utilisateur de rechercher par prénom, nom de famille ou les deux. Vous devriez donc vérifier si le paramètre passé est vide, puis ne pas en faire une condition. S'ils fournissent tous les paramètres vierges, ils retourneront toute la table. Essayez:

select t from table t 
where (:firstname IS NULL or t.firstName = :firstName) AND 
(:lastName IS NULL OR t.lastName = :lastName) 
+0

merci ... c'était à peu près ce que je cherchais. –

0

(:firstname = '' or t.firstName = :firstName)

Vos critères est étrange. Si: firstname = '' et si un prénom (t.firstName) est égal à '' dans la base de données, le critère t.firstName =: firstName est bon ('' = '')

Vous n'avez pas besoin: prenom = « »

Mais si vous voulez vérifier la valeur null, vous devez faire:

t.firstName IS NULL or t.firstName = :firstname 
+0

C'est ce que j'ai et ça ne marche toujours pas. SELECT p à partir de la table p WHERE (: firstName est null OU p.firstName LIKE '%: firstName%') ET (: lastName est nul OU p.lastName LIKE '%: lastName%') AND (: le genre est nul OU p .gender =: gender) où prénom et nom sont des chaînes et le genre est un entier –

+0

ce que j'essaie de faire est d'ignorer toutes les valeurs nulles ou vides passées à la fonction.c'est pourquoi j'ai eu: firstname = '' initialement. –

+0

Vous ne pouvez pas faire votre condition comme celle-ci. Vous devez faire firstname = "%" + prénom + "%"; Ensuite, dans votre requête: p.firstName est nul ou p.firstName LIKE: prenom pas faire: prenom est nulle (condition inutile, ne p.firstName est nulle) – Kiva

0

Qu'advient-il si vous exécutez suivant hql avec le paramètre prenom la chaîne est vide?

select t from table t where (:firstname = '') 

et après avec le paramètre prenom réglé sur null:

select t from table t where (:firstname is null) 

Si l'un des rendements supérieurs à toute la table puis le HQLs paramètre nommé peut prendre en charge ce que vous essayez de faire.

Sinon, vous devez utiliser différentes requêtes pour les cas de paramètres null. Vous pouvez le faire en générant la requête de manière dynamique.

+0

J'essaie de tout faire en une seule fois si possible. Générer une requête dynamique n'est pas une option que je veux prendre. Comment pouvons-nous faire cela dans une chaîne de requête? –

+0

Pourquoi ne voulez-vous pas faire une requête dynamique? – Kiva

+0

l'option n'est pas là. le projet est configuré de cette façon. longue histoire courte - ne peux pas faire une requête dynamique. –

0

J'avais une exigence similaire. Je veux dynamique mais j'utilise un outil qui donne juste un éditeur HQL, donc pas de Java.

La requête ci-dessous tient compte des paramètres optionnels. Essentiellement un XOR pseudo-quazi de toutes sortes. . . souhaiter qu'il y ait du vrai XOR:/

Avec cette requête, vous mettez simplement NA dans un param au lieu de le laisser vide s'il n'est pas nécessaire.

Ouais, ouais, ouais. . . c'est moche, mais ça marche et il est facile de passer à n'importe quel autre scénario nécessitant des params optionnels en HQL pur.

SELECT t AS table 
FROM Table t 
WHERE (t.valSet = :valSet 
    AND (:category= 'NA' AND :subCategory= 'NA')) 
OR (:category != 'NA' 
    AND (t.valSet = :valSet 
     AND t.category= :category)) 
OR (:subCategory != 'NA' 
    AND (t.valSet = :valSet 
     AND t.subCategory = :subCategory))