EJB-QL : Clause where in dynamique [résolu]

EJB-QL : Clause where in dynamique [résolu] - Java - Programmation

Marsh Posté le 27-11-2004 à 11:42:59    

Salut tout le monde,
 
Est-il possible, en utilisant EJB-QL 2.0, de construire une clause WHERE IN (...) de manière dynamique ?
 
Je souhaiterais filter les données sur base multi-critères. La clause pourrait être WHERE IN ('a', 'b') mais aussi ('a', 'b', 'c'), avec un nombre variable de paramètres dans la clause IN.
 
J'ai naïvement successivement essayé :
 
- De construire la clause WHERE IN (?1) en passant String s = "'a', 'b', 'c'" -> aucune ligne retournée;
- Dans une tentative de hacking, je me suis dit que le paramètre ?1 était remplacé par '[la chaîne s]', et que donc, je devrais essayer de ne pas passer les guillemets simples ouvrants et fermants : String s = "a', 'b', 'c"; -> idem;
- De passer une collection pour le troisième paramètre -> ça ne compile même pas.
 
Existe-t-il une solution élégante et efficace, sans devoir passer par JDBC ?
 
Merci.  [:crosscrusher]


Message édité par sircam le 30-11-2004 à 10:24:48

---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 27-11-2004 à 11:42:59   

Reply

Marsh Posté le 27-11-2004 à 19:32:01    

[:blueflag]
 
A ma connaissance tu ne peux pas. Par contre, tu peux overrider ta query EJB-QL par un truc proprio.
 
JBoss par exemple te permet de passer certaines limitations d'EJB-QL. Quand au fait que la clause IN est dynamique, j'ai un doute ...
 
C'est quoi ton application server?
 

Reply

Marsh Posté le 28-11-2004 à 13:43:30    

darklord a écrit :

[:blueflag]
 
A ma connaissance tu ne peux pas. Par contre, tu peux overrider ta query EJB-QL par un truc proprio.
 
JBoss par exemple te permet de passer certaines limitations d'EJB-QL. Quand au fait que la clause IN est dynamique, j'ai un doute ...
 
C'est quoi ton application server?


BEA Weblogic 6.1 :-/
 
"overrider ta query EJB-QL par un truc proprio" -> tu penses à quoi ? C'est application-server specific ?
 
J'ai bien sûr cherché avant de poser la question ici, mais j'ai rien trouvé. J'ai aussi un sérieux doute, mais bon, comme c'est finalement un cas tout à fait commun (filtrer sur plusieurs critères possibles), je trouve que c'est un peu laid de devoir passer par un "override".
 
La tentation d'exécuter le query EJB "complet" sans la clause WHERE IN, puis de filtrer la collection retournée est grande. C'est élégant, mais ça cache une complexité ayant un impact très négatif sur les perfs.


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 29-11-2004 à 19:16:16    

Oui, c'est application-server specific.
 
Weblogic 6.1, laisse tomber :/


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 29-11-2004 à 19:28:23    

darklord a écrit :

Weblogic 6.1, laisse tomber :/


Parce que tu crois que j'ai le choix  :p


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 29-11-2004 à 21:40:23    

nan, le 'in' c'est intrinsèquemen statique.
 
on peut avoir un peu plus de contexte ?
 
et non ?1 n'est pas remplacé par la chaine de caractères, sûrement pas, jamais, plutôt mourrir. C'est un vrai binding abstrait.
 
edit : bingo  
 
cmp_path_expression [NOT] IN ({literal|input_parameter}[, {literal|input_parameter]*)
 
ça veut dire que le cardinal est fixé à la compilation (du SQL , donc).


Message édité par nraynaud le 29-11-2004 à 22:11:07

---------------
trainoo.com, c'est fini
n°910729
sircam
I Like Trains
Posté le 29-11-2004 à 22:00:13  profilanswer
 

Exemple de contexte (je simplifie car le cas d'espèce est trop abstrait en changeant les noms de table et de champs) : j'ai une table "transactions" dont un des champs est "status". Status peut prendre plusieurs valeurs : "alpha", "beta", "gamma", "delta".
 
Je veux pouvoir retrouver une collection d'entity beans qui corresponde à la liste des "transactions" ayant un "status" donné, ou une combinaison d'un certain nombre de "status" :
- tous les "alpha";
- tous les "beta" et tous les "gamma";
- tous les "delta" et tous les "alpha" et tous les "gamma";
- etc
 
Si je travaillais en JDBC, je construirais p.e. dynamiquement la clause IN du query, qui ressemblerait respectivement à :
- IN ('alpha');
- IN ('beta', 'gamma');
- IN ('delta', 'alpha', 'gamma');
 
en fonction d'une collection de "status" passée en paramètre (une clause WHERE avec des OR donnerait un résultat identique).
 
C'est ce que j'entends par "dynamique". Un cas somme tout élémentaire, mais qui ne semble pas se prêter à un query EJB dirait-on, et c'est fort regretable.


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 29-11-2004 à 22:14:19    

les valeurs prises par le champ "status", elle sont en nombre fixe ou c'est appellé à augmenter ?
 
là je songe à un index sur "status", puis autant de Select que nécessaire dessus.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 29-11-2004 à 22:19:29    

nraynaud a écrit :

les valeurs prises par le champ "status", elle sont en nombre fixe ou c'est appellé à augmenter ?
 
là je songe à un index sur "status", puis autant de Select que nécessaire dessus.


C'est en nombre à peu près fixe. Dans le cas présent, il y d'autres alternatives, mais je reste sur ma faim. Si d'aventure le nombre de "filtres" venait à s'élargir, on aimerait avoir en tête une solution robuste et généralisable sous la main.
 
Plusieurs selects : bof bof bof. Sur le temps de réponse total, la communication application server / database n'est pas négligeable. Répeter les selects, c'est pas top. Outre le fait qu'il faille ensuite concatener les différentes collections retournées.


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 29-11-2004 à 22:20:39    

ah non !!!!!
 
page 249 :
{single_valued_cmr_path_expression | identification_variable | intput_parameter} [NOT] MEMBER [OF] collection_valuated_path_expression


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 29-11-2004 à 22:20:39   

Reply

Marsh Posté le 29-11-2004 à 22:22:51    

sircam a écrit :

la communication application server / database n'est pas négligeable. Répeter les selects, c'est pas top. Outre le fait qu'il faille ensuite concatener les différentes collections retournées.

1) on est *dans* le serveur là
2) rien de t'oblige à les tirer tout de suite de la bdd
3) la concaténation est gratuite chez les gens normaux.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 29-11-2004 à 22:24:32    

(les fautes dans les non-terminaux de la grammaire, c'est parce que je les tape à la main, ils parlent à peu près bien anglais chez java)


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 29-11-2004 à 22:36:11    

EJB-QL BNF : tu pourrais être plus explicite sur le passage qui tu cites ? Je ne parviens pas à faire le rattachement avec where_clause ::= WHERE conditional_expression, si c'est de ça dont tu veux parler.
 
1) :heink: SELECT -> heu envoyé par l'application server au dbms, qui l'exécute et renvoie le résultat (?!?)
2) "Les tirer de la db" -> mais si tu fais l'appel à la DB, beh, il est fait, l'appel ?
3) Oui, c'est pas un problème.
 
J'ai un peu de mal à te suivre, ce soir, sans doute besoin d'un peu de repos, ne m'en veux pas.  :sol:


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 29-11-2004 à 22:44:49    

c'est ptet con, mais tu peux pas filer une collection ou un array comme argument a ton ejbql? [:slackerbitch]


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 29-11-2004 à 22:47:03    

the real moins moins a écrit :

c'est ptet con, mais tu peux pas filer une collection ou un array comme argument a ton ejbql? [:slackerbitch]


J'ai essayé le coup de la collection, dans la série "essaye pour voir ça va p'têt marcher", mais ça compilait pô - pas noté le message, j'ai laissé de côté dans un coup de rage et j'ai pris la solution dirty  :(


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 29-11-2004 à 22:47:18    

pour la BNF : ce que je cite est  
collection_member_expression ::= <mon truc d'au-dessus>
 
et collection_member_expression, c'est une simple_cond_expression.
 
en clair :  

Code :
  1. SELECT OBJECT(o) FROM Pipo o WHERE o.status MEMBER OF ?1


et tu bindes un Arrays.asList(new String[]{"pipo", "pipi"}) sur l'argument 1.
 
ça fait *exactement* ce que tu veux.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 29-11-2004 à 22:47:56    

keske je disais :o


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 29-11-2004 à 22:48:24    

sircam >> ton finder etait probablement pas bien déclaré !?
tu utilises xdoclet ou tu fais tout à la main?


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 29-11-2004 à 22:55:05    

[:super chinois]
 
Mais c'est tout con ! Voilà, j'étais passé à côté. Merci beaucoup. C'est super élégant. Je vais bien dormir cette nuit.
 
Bien vu !
 
Real : je fais tout à la main  [:crusty128]


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 29-11-2004 à 22:59:39    

quand je pense que j'ai jamais développé une appli J2EE de ma vie et que je demande que ça ...


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 29-11-2004 à 23:05:38    

nraynaud a écrit :

quand je pense que j'ai jamais développé une appli J2EE de ma vie et que je demande que ça ...


Beuah  :heink: ?
 
Bof, on en revient.


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 29-11-2004 à 23:07:58    

J'en suis *déjà* revenu, mais c'est le seul moyen de rentrer en dev. Et puis il doit y avoir des aspects que j'avais pas vu, comme quand je me suis lancé dans les javabeans.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 02-12-2004 à 13:54:43    

[:toad666] Ca marche pas avec Weblogic 6.1 ! Repli sur la solution "dirty". [:sisicaivrai]


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 02-12-2004 à 14:26:26    

keski marche pas avec wl ?


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 07-12-2004 à 10:14:41    

Beh, le MEMBER OF. EJBC rouspète, syntaxe incorrecte. Et effectivement, on en trouve trace dans la doc 7.0, mais rien en 6.1...


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 07-12-2004 à 11:19:27    

c'est l'occasion de convaincre les décideur de jeter cette merde [:tartalap]


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 07-12-2004 à 11:51:54    

C'est pas comme ça que ça marche, faut pas rêver :-/
 
A l'echelle du projet, ce genre de soucis est sans importance aucune et ne remet pas en cause le choix de l'architecture...


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 07-12-2004 à 13:30:46    

je te parle plus des outils que de l'architecture


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 07-12-2004 à 14:13:22    

Ca reste d'autant plus d'application.
 [:manu512]


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 08-12-2004 à 19:57:20    

sircam a écrit :

[:toad666] Ca marche pas avec Weblogic 6.1 ! Repli sur la solution "dirty". [:sisicaivrai]


 
bin vi, je t'avais dit de laisser tomber :D


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 08-12-2004 à 20:04:28    

tu avais surtout dit qu'il n'y avait pas de solution standard :o

Reply

Marsh Posté le 09-12-2004 à 09:18:21    

Bah, j'avais une solution, mais je c'était pour la beauté du geste, pour faire propre.
 
Au moins, on a appris qq chose.


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 12-12-2004 à 20:20:09    

the real moins moins a écrit :

tu avais surtout dit qu'il n'y avait pas de solution standard :o


 
Et que weblogic 6.x est une belle merde au niveua implémentation (que ce soit le standard ou pas d'ailleurs).


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 12-12-2004 à 20:46:46    

darklord a écrit :

Et que weblogic 6.x est une belle merde au niveua implémentation (que ce soit le standard ou pas d'ailleurs).


J'ose espérer que ça s'améliore avec la version 8 et la 9 à venir...


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 12-12-2004 à 21:17:53    

elle vient pas de sortir la 9 ?

Reply

Marsh Posté le 12-12-2004 à 21:22:07    

en beta, non ?


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 12-12-2004 à 21:26:45    

sircam a écrit :

hen t'es un gros beta, non ?

han lalalala, il insulte le nouveau modo !!!


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 12-12-2004 à 21:30:48    

Pas de pollution de mon topic  :sol:


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 12-12-2004 à 21:32:15    

[:dawa]


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 14-12-2004 à 21:42:37    

sircam a écrit :

en beta, non ?

http://today.java.net/pub/n/2037


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed

© 2018 Forum. All Rights Reserved.