我有一个简单的博客示例:Post表,Tag表和链接这两个表的Post_Tag_MM查找表。
我使用这个hql查询来获取所有帖子,DONT有一些标签:
var result = session
.CreateQuery(@"
select p from Post p
join p.Tags t
where (select count(ti) from p.Tags ti where ti.Uid in (:uidList)) = 0
")
.SetParameterList("uidList", uidList)
.SetResultTransformer(new DistinctRootEntityResultTransformer())
.List<Post>();
如何将这种多对多查询和子选择转换为条件查询?
我还不太了解DetachedCriteria API,但无法让它返回正确的结果集。
非常感谢你。
此致
最高
答案 0 :(得分:2)
如果我已正确理解了这个问题,那么你有一个包含名为Post_Tag_MM的PostId,TagId关系的连接表,并且你想要所有没有任何标签ID标签的帖子。然后,在普通的SQL中你可以这样做:
从id不在的帖子中选择*(从Post_Tag_MM中选择不同的PostId,其中TagId在(1,2,3)中);
使用DetachedCrietria API,假设您已将Post_Tag_MM表映射到PostTag类,该子查询将如下所示:
var subCriteria = DetachedCriteria.For(typeof (PostTag))
.SetProjection(Projections.Property("PostId"))
.Add(Restrictions.PropertyIn("TagId", tagIdList));
将'属性'子查询标准附加并否定为您的主要标准
var result = session.CreateCriteria.For(typeof(Post))
.SetResultTransformer(new DistinctRootEntityResultTransformer())
.Add(Subqueries.PropertyNotIn("Id", subCriteria))
.List<Post>();
答案 1 :(得分:0)
您需要使用DetachedCriteria来表示子选择。然后将该查询添加到具有子查询约束的CreateCriteria。
答案 2 :(得分:-1)
尝试以下方法。假设uidList是标签ID的集合。
var results = S.CreateCriteria(typeof(Post))
.CreateCriteria("Tags")
.Add(
Expression.Not(
Expression.In("Uid", uidList)
)
)
.List<Post>();
可能有一种更有效的方法,尽管这在过去对我有用。 它可能不是语法完美,但我希望,一般原则应该让你再次移动。