Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

JDBC : plusieurs conditions possibles

5 réponses
Avatar
Pif
Bonjour, je voudrais faire un requete de recherche en modifiant le
nombre de parametres... c'esst à dire en choisissant plusieurs critères :

ex : sur une meme requete : si j'ai trois champs entiers : age, taille,
nombre d'heures, pouvoir chercher tous les hommes de taille x et age y
ou encore d'age z .... je peux avoir 0 à n critères (1 à n-1
éventuellement), qui sont tous de type int, et pourquoi pas de type
autre si c'est faisable....

le preparedstatement de java.sql et ses "?" ne me semble pas suffisant,
qui peut me proposer une solution ?

Pour des questions d'optimisation, je préfère ne pas recreer un
statement systématiquement et me taper plein de conditionnelles...


Je suis à la recherche d'une solution SQL et Java (pasque faut filer les
conditions en parametres aussi, et la surdéfinition de méthode trouve
ses limites... ex : comment distinguer f(age,taille) de f(age,poids) ...

Des tableaux chaines de caractères et masques sont faisables pour un
petit nombre de critères mais c'est pas élégant.


Merci pour vos suggestions !

5 réponses

Avatar
Patrick Gras
Hello,

Si tu veux faire ça avec une seule SQL voilà un exemple:

SELECT age, taille FORM maTable WHERE (0=? OR age=?) AND (0=? OR taille=?)

Si le critère age n'a pas d'importance tu met (0=0 OR age=0) AND (0=1 OR
taille0)

Et voilà
-Patrick


"Pif" wrote in message news:df4j3c$mc3$
Bonjour, je voudrais faire un requete de recherche en modifiant le
nombre de parametres... c'esst à dire en choisissant plusieurs critères :

ex : sur une meme requete : si j'ai trois champs entiers : age, taille,
nombre d'heures, pouvoir chercher tous les hommes de taille x et age y
ou encore d'age z .... je peux avoir 0 à n critères (1 à n-1
éventuellement), qui sont tous de type int, et pourquoi pas de type
autre si c'est faisable....

le preparedstatement de java.sql et ses "?" ne me semble pas suffisant,
qui peut me proposer une solution ?

Pour des questions d'optimisation, je préfère ne pas recreer un
statement systématiquement et me taper plein de conditionnelles...


Je suis à la recherche d'une solution SQL et Java (pasque faut filer les
conditions en parametres aussi, et la surdéfinition de méthode trouve
ses limites... ex : comment distinguer f(age,taille) de f(age,poids) ...

Des tableaux chaines de caractères et masques sont faisables pour un
petit nombre de critères mais c'est pas élégant.


Merci pour vos suggestions !


Avatar
Pif
Ahh..... voila une bonne suggestion, je suis couillon de pas y' avoir
pensé plus tot !

Bon, alors la je sais comment faire 1 seul statement, et ca me branche
bien...

maintenant j'ai plein de parametres et si je décline, ca me fait
décliner plein de prototypes de fonctions différentes, et la surcharge a
ses limites f(int, int, int, int) par exemple,comment savoir ?

Si quelqu'un a une astuce, ca me branche tout plein !

merci !




Hello,

Si tu veux faire ça avec une seule SQL voilà un exemple:

SELECT age, taille FORM maTable WHERE (0=? OR age=?) AND (0=? OR taille=?)

Si le critère age n'a pas d'importance tu met (0=0 OR age=0) AND (0=1 OR
taille0)

Et voilà
-Patrick


Avatar
Simon OUALID
Pif wrote:
maintenant j'ai plein de parametres et si je décline, ca me fait
décliner plein de prototypes de fonctions différentes, et la surcharge a
ses limites f(int, int, int, int) par exemple,comment savoir ?


Tu peux utiliser un tableau d'objets plutôt que des primitives... Ou une
map si tu as vraiment une chiée de paramètres.

execute(Object[] o);

ou

execute(Map m);

Après tu dépiottes pour construire la requête qui va bien.

Symon

Avatar
Patrick Gras
Hello,

J'imagine qu'il n'y a pas tant de paramètres que ça.

Pourquoi tu n'écrit pas une seule méthode qui prend tous les paramètres, et
tu passe null si ce n'est pas un critère (ou une valeur par défaut si tu
utilises des int.)


public List findPersonne(Integer age, Integer poids, Integer taille)
{
int critereAge=1;
int criterePoids=1;
int critereTaille=1;

if (age=null){ age = new Integer(0); critereAge=0; }
if (poids=null){ poids= new Integer(0); criterePoids=0; }

SQL = Select xxx where ( 0=critereAge OR age=age) AND ( 0=criterePoids OR
poids=poids) AND ....

}


-Patrick


"Simon OUALID" wrote in message
news:df6ok5$df6$
Pif wrote:
maintenant j'ai plein de parametres et si je décline, ca me fait
décliner plein de prototypes de fonctions différentes, et la surcharge a
ses limites f(int, int, int, int) par exemple,comment savoir ?


Tu peux utiliser un tableau d'objets plutôt que des primitives... Ou une
map si tu as vraiment une chiée de paramètres.

execute(Object[] o);

ou

execute(Map m);

Après tu dépiottes pour construire la requête qui va bien.

Symon



Avatar
Pif
c'est ce que j'ai fini par faire :) mais je révais à une technique à
laquelle j'avais pas pensée qui soit plus efficace et lisible/pratique à
manipuler....

merci...