Bonjour,
Je vous expose mon probleme : travaillant avec le framework Ibatis (2.3.0 obligé d'utiliser cette version) je voudrais ecrire une requete dynamique qui me permette de personnaliser le code SQL qui s'y trouve.
Je m'explique : dans le cadre d'un projet de developpement de connecteur mylyn, grace a l'interface graphique fournie par mylyn pour creer des Query j'ai la possibilité de personnaliser la recuperation des taches par le biais du choix du/des Projet(s)/Priorité(s)/etc ..

Je vous link la requête en question :
Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<select id="searchForKey" parameterClass="ibatisCriteria" resultClass="string">
SELECT DISTINCT requete_id as taskId FROM table_requetes,table_utilisateurs,table_requete_statut,table_requete_priorites
WHERE table_requetes.affectee_a_res = 'ID_UTILISATEUR'
AND REQUETES.statut_id IN (40,60)
<dynamic> 
<isNotEmpty property="product">
AND table_projets.projet_id = table_requetes.projet_id
</isNotEmpty>
<isNotEmpty property="priority">
AND table_requete_priorites.priorite_id = table_requetes.priorite_id
</isNotEmpty>
<isNotEmpty property="issueStatus">
AND table_requete_statut.statut_id = table_requetes.statut_id
</isNotEmpty>
</dynamic>
<dynamic prepend="WHERE">
<isNotEmpty property="summary" prepend="AND"
removeFirstPrepend="true"> table_requetes.sommaire LIKE '%$summary$%'
</isNotEmpty>
<isNotEmpty property="product">
<iterate property="product" conjunction="OR" open="(" close=")"
prepend="AND" removeFirstPrepend="true">
table_projets.description = #product[]#</iterate>
</isNotEmpty>
<isNotEmpty property="priority">
<iterate property="priority" conjunction="OR" open="(" close=")"
prepend="AND" removeFirstPrepend="true">
table_requete_priorites.description = #priority[]#</iterate>
</isNotEmpty>
<isNotEmpty property="issueStatus">
<iterate property="issueStatus" conjunction="OR" open="(" close=")"
prepend="AND" removeFirstPrepend="true">
table_requete_statut.description = #issueStatus[]# </iterate>
</isNotEmpty>
</dynamic>        
</select>

Tout d'abord je sais que la requete est techniquement fausse puisqu'il y a un premier WHERE et un autre WHERE dans la partie dynamique (et aussi des tables superflues dans le FROM) mais il faudrait juste m'aider a comprendre le principe des requetes dynamiques avec IBATIS.

But : il faudrait obtenir une requete SQL qui ait une partie WHERE qui puisse changer suivant certaines conditions (champs selectionnées ou pas dans l'interface graphique)
correspondant a cette partie la :
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<dynamic> 
<isNotEmpty property="product">
AND PROJETS.projet_id = REQUETES.projet_id
</isNotEmpty>
<isNotEmpty property="priority">
AND req_priorites.priorite_id = REQUETES.priorite_id
</isNotEmpty>
<isNotEmpty property="issueStatus">
AND req_statut.statut_id = REQUETES.statut_id
</isNotEmpty>
</dynamic>
<dynamic prepend="WHERE">
<isNotEmpty property="summary" prepend="AND"
removeFirstPrepend="true"> REQUETES.sommaire LIKE '%$summary$%'
</isNotEmpty>
<isNotEmpty property="product">
<iterate property="product" conjunction="OR" open="(" close=")"
prepend="AND" removeFirstPrepend="true">
PROJETS.description = #product[]#</iterate>
</isNotEmpty>
<isNotEmpty property="priority">
<iterate property="priority" conjunction="OR" open="(" close=")"
prepend="AND" removeFirstPrepend="true">
req_priorites.description = #priority[]#</iterate>
</isNotEmpty>
<isNotEmpty property="issueStatus">
<iterate property="issueStatus" conjunction="OR" open="(" close=")"
prepend="AND" removeFirstPrepend="true">
req_statut.description = #issueStatus[]# </iterate>
</isNotEmpty>
</dynamic>
et le plus important qui ait une partie WHERE qui est toujours FIXE pour pouvoir specifier quel est l'UTILISATEUR dont les taches seront recuperes c'est a dire cette ligne la :
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
WHERE table_requetes.affectee_a_res = 'ID_UTILISATEUR'


Pour conclure : je n'arrive pas a comprendre la fonction du mot-clé "prepend" meme s'il veut dire "prefixé" mais surtout je n'arrive pas a comprendre comment prevoir cette partie la FIXE du WHERE.
Je precise je travaille sur une base Oracle 8.


Cordialement,
BM