2010-03-05 11 views
6

Jak przekazać listę rzeczy do klauzuli "w" w Nhibernate HQL?Parametryzacja klauzuli HQL IN za pomocą HqlBasedQuery?

np.

// 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); 

Teraz to nie zadziała, tak bardzo, jak bym sobie tego życzył! Ja naprawdę zatrzymany robi coś takiego:

// 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); 

to po prostu brzydki i starałem się zrobić to jak nie brzydki i krótki, jak tylko mogę. Jeśli ktoś ma dobry sposób na osiągnięcie tego celu, daj mi znać.

Widzę również, że Jeff zadał podobne pytania dotyczące tego w SQL: Parameterize an SQL IN clause Jest to w zasadzie to samo pytanie, które chcę tylko wiedzieć, jak to zrobić z HQL. Właśnie dlatego robię tytuły tak podobne.

+0

ICriteria dobrze nadaje się do tego. zobacz Restrictions.In() – dotjoe

Odpowiedz

8

Użyj SetParameterList().

Code snippet from 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(); 
+0

Dzięki! Właśnie tego szukałem. –

+0

+1 To jest właściwy sposób i działa zgodnie z oczekiwaniami. – Jaguar

+0

Masz zepsuty link –

Powiązane problemy