6 votes

Paramétrer une clause IN HQL à l'aide de HqlBasedQuery ?

Comment passer une liste de choses pour la clause 'in' dans Nhibernate HQL ?

par exemple

// data input from the user interface, not known at compile time
object[] productIds = {1, 17, 36, ... }; 
string hqlQuery = @"
                from Product as prod
                where prod.Id in ( ? )";
HqlBasedQuery query = new HqlBasedQuery(typeof(Product), hqlQuery, productIds)
ActiveRecordMediator.ExecuteQuery(query);

Cela ne va pas marcher, même si j'aimerais que ce soit le cas ! Suis-je vraiment coincé à faire quelque chose comme ça ?

// data input from the user interface, not known at compile time
object[] productIds = {1, 17, 36, ... }; 
string hqlQuery = @"
                from Product as prod
                where prod.Id in ( {0} )";

// build string array of the right number of '?' characters
string[] paramStringArray = new String('?', productIds.Length).ToCharArray().Select(item => item.ToString()).ToArray();
// join to make '?, ?, ?, ?, ?'
string parameterString = string.Join(", ", paramStringArray);
hqlQuery = string.Format(hqlQuery , parameterString);

HqlBasedQuery query = new HqlBasedQuery(typeof(Product), hqlQuery, productIds)
ActiveRecordMediator.ExecuteQuery(query);

C'est tout simplement moche et j'ai essayé de faire en sorte que ce soit le moins moche et le plus court possible. Si quelqu'un a une bonne façon d'y parvenir, qu'il me le fasse savoir.

Je vois aussi que Jeff a posé une question similaire sur SQL : Paramétrer une clause SQL IN C'est à peu près la même question, je veux juste savoir comment le faire à partir de HQL. C'est pourquoi les titres sont si semblables.

8voto

Mauricio Scheffer Points 70470

Utilice SetParameterList() .

Extrait de code de billsternberger.net :

ArrayList stateslist = new ArrayList();
stateslist.Add("TX");
stateslist.Add("VA");

string hql = String.Format("FROM Contact c where State in (:states)");
SimpleQuery<Contact> q = new SimpleQuery<Contact>(hql);
q.SetParameterList("states", stateslist);

Contact[] result = q.Execute();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X