으로 표현하는 것이 더 쉬울 수 있습니다 하위 쿼리를 사용하여이를 나타낼 수 있다고 생각
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
하나입니다 : 여기에 그들이 거기에 보여 SQL입니다 - 투 - 많은 관계 범주는이 일을 아주 더러운 방법 (I이 정말 자랑 모르지만 작동)
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를 보장하는 것입니다. 특히 ID 목록이 커지면 쿼리가 매우 느려야합니다.
나는이 해결책을 권장하지는 않지만 최소한 적절한 것을 찾으면서 뭔가를 할 수 있습니다.
소리가 매우 들리며, nhuser 목록에서 같은 제안을 받았습니다. 나는 이것을 기준에 넣을 수 있는지를 보게됩니다 - 지나치게 복잡하지는 않습니다. – Jan
HQL을 사용하는 쿼리 메소드의 경우 http://stackoverflow.com/questions/948978/nhibernate-query-for-matching-all-tags를 참조하십시오. – iammichael