假設文章類別代表表示此
SELECT b.*
FROM tagmap bt, bookmark b, tag t
WHERE bt.tag_id = t.tag_id
AND (t.name IN ('bookmark', 'webservice', 'semweb'))
AND b.id = bt.bookmark_id
GROUP BY b.id
HAVING COUNT(b.id)=3
是一個一對多的關係,該類別有許多對一個屬性調用文章在這裏是這樣做的一個非常骯髒的方式(我真的不爲此感到自豪,但它的工作原理)
List<long> catkeys = new List<long>() { 4, 5, 6, 7 };
if (catkeys.Count == 0)
return;
var cr = Session.CreateCriteria<Article>("article")
.CreateCriteria("Categories", "cat0")
.Add(Restrictions.Eq("cat0.Id", catkeys[0]));
if (catkeys.Count > 1)
{
for (int i = 1; i < catkeys.Count; i++)
{
cr = cr.CreateCriteria("Article", "a" + i)
.CreateCriteria("Categories", "cat" + i)
.Add(Restrictions.Eq("cat" + i + ".Id", catkeys[i]));
}
}
var results = cr.List<Article>();
它所確實是一遍又一遍地重新加入關係,保證你在類別ID之間的AND。它應該是非常慢的查詢,尤其是如果Ids列表變大。
我提供此解決方案不是推薦的方式,但至少您可以在尋找合適的解決方案時找到適合的解決方案。
聽起來很合理,我在nhuser列表上收到了同樣的建議。我會看看我是否可以將其納入標準 - 似乎並不複雜。 – Jan
另請參閱:http://stackoverflow.com/questions/948978/nhibernate-query-for-matching-all-tags查詢方法使用HQL。 – iammichael