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 :
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 :
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 :
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
Partager