2010-03-05 12 views
6

Nhibernate HQL'deki 'in' cümleciğine ilişkin bir şeyler listesini nasıl iletirsiniz?HqlBasedQuery kullanarak HQL IN yan tümcesini parametrelendirme?

örn.

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

Şimdi, bu işe yaramıyor, istediğim kadar işe yaramıyor! Gerçekten böyle bir şey yaptığını şaşırıp:

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

sadece çirkindir ve elimden geldiğince o kadar çirkin ve kısa değil yapmaya çalıştık. Bunu gerçekleştirmenin iyi bir yolu varsa lütfen bana bildirin.

Ayrıca Jeff'in SQL'de nasıl yapılacağıyla ilgili benzer sorular sorduğunu da görüyorum: Parameterize an SQL IN clause Bu temelde aynı soruyu HQL'den nasıl yapacağımı bilmek istiyorum. Bu yüzden başlıkları çok benzer yapıyorum.

+0

ICriteria bunun için de çok uygundur. Restrictions.In() – dotjoe

cevap

8

SetParameterList()'u kullanın.

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

teşekkürler! Tam olarak aradığım şey bu. –

+0

+1 bu uygun yoldur ve beklendiği gibi çalışır. – Jaguar

+0

Kırık bir linkiniz var –