2011-06-18 2 views
0

Comment une condition peut-elle être spécifiée dans une clause where d'une requête JPA nommée pour une base de données MySQL 5.1, dans le cas où certains attributs sont passés en tant que paramètre sont nullables? Exemple: La table contient attribute_1 qui est nullable et attribute_2 qui n'est pas Nullable. Le contenu est:Condition MySQL dans where-clause d'une requête JPA nommée query avec un attribut nullable comme paramètre

 
    id attribute_1 attribute_2 
    -- ----------- ----------- 
    1  {null}   123 
    2  X    456 

Le résultat de la requête doit être fiche 1 si: PARAM_1 = null ET: PARAM_2 = "123"

Le résultat de la requête devrait être record 2 si: PARAM_1 = "X" ET: PARAM_2 = "456"

La requête ne devrait avoir aucun résultat si, par exemple: PARAM_1 = "X" ET: PARAM_2 = "123"

Merci!

+0

Élaborer votre question – K6t

Répondre

1

J'ai résolu le problème en utilisant une requête native. Je ne peux pas le faire fonctionner avec une requête JP-QL. je la condition

AND IF(?1 IS NULL, b.attribute_1 IS NULL, b.attribute_1 = ?1) 

dans la clause where (1? Est l'espace réservé pour le paramètre).

0

Pour votre première ligne, vous devez changer la clause where dans votre requête:

where attribute_1 is null 

En utilisant = au lieu céderais aucune ligne, puisque a = null est toujours null.

+0

Ce n'est pas si simple. Dans une requête nommée, la clause where pourrait ressembler à 'WHERE table.attribute_1 =: param_1 et table.attribute_2 =: param_2'. Le problème est le suivant: param_1 peut être la valeur Java nulle. – prockel

+0

Oui, je pensais autant. Mais vous n'avez aucune solution de contournement. Si ': param_1' est nul alors passez' attribute_1 est nul', sinon 'attribute_1 =: param_1'. Différentes déclarations Vous pouvez combiner/OU les deux avec une condition sur ': param_1' mais cela endommagera votre plan de requête si l'instruction est préparée. –

+0

Je ne suis pas sûr de comprendre ce que vous voulez dire. Passer une chaîne comme 'attribute_1 is null' n'est pas possible. Et id ne résout pas le problème, car la requête ne peut pas être formulée de telle sorte que 'attribute_1 est null' et que' attribute_1 = param_1' puisse être rempli correctement. J'ai résolu le problème d'une autre manière, voir la réponse suivante. – prockel