J'avais un scénario dans Oracle où je devais faire correspondre une partie de la colonne avec une liste de valeurs. J'utilisais la projection sqlfunction pour appliquer la sous-chaîne sur la colonne requise, et j'ajoutais cette projection dans le cadre d'une Restriction In Clause. Voici les critères simplifiés que j'ai écrits pour cela.Critères NHibernate utilisant des projections pour la sous-chaîne avec la clause
ICriteria criteriaQuery = session.CreateCriteria<Meeting>()
.Add(Restrictions.In(
Projections.SqlFunction(
"substring",
NHibernateUtil.String,
Projections.Property("Code"),
Projections.Constant(1),
Projections.Constant(3)),
new string[] { "D01", "D02" }))
.Add(Restrictions.In("TypeId", meetingTypes));
Le problème que j'avais avec cela était que le SQL généré était erronée, où le nombre de paramètres enregistrés pour la déclaration sont plus que ce que l'énoncé utilise en fait et certains paramètres sont répétés, même si elles ne sont pas utilisés . Cela provoque l'échec de l'instruction avec le message - ORA-01036: nom/numéro de variable illicite. généré la requête
SELECT this_.Meeting_id as Meeting1_0_2_, .....
WHERE substr(this_.Mcs_Main, :p0, :p1) in (:p2, :p3)
and this_.Meeting_Type_Id in (:p4, :p5);
:p0 = 1, :p1 = 3, :p2 = 1, :p3 = 3, :p4 = 'D02', :p5 = 'D03', :p6 = 101, :p7 = 102
et p3 sont p2 de nouveau générés et sont des doublons de p1, p0 en raison de laquelle toute requête échoue.
J'ai été capable de résoudre temporairement ceci en mappant une nouvelle propriété avec une formule, mais je ne pense pas que ce soit la bonne approche puisque la formule sera toujours exécutée même quand je n'ai pas besoin d'évaluer la sous-chaîne .
Toute suggestion sur le fait que les projections fonctionnent correctement lorsqu'elles sont utilisées avec la combinaison de la clause In, la même projection fonctionne correctement lorsque j'utilise Restriction égale et non In.
Quelle version de NHibernate utilisez-vous? –
J'utilise 2.1 GA –
J'ai eu un scénario similaire avec NH et Oracle, mais il a été corrigé pour 2.1. J'ai trouvé qu'un bug avait été soumis en allant sur leur site Jira: http://nhjira.koah.net/secure/Dashboard.jspa Aussi vous pouvez leur demander sur IRC à ## nhibernate à freenode. –