想象一下下面的表格:
标记(TagId,标签)
发布(PostId,标题,内容)
用户(UserId,姓名)
UserPostTag (Id,UserId,PostId,TagId)
对于帖子,多个用户可以添加一个或多个标签。
我想通过nHibernate获取帖子的标签列表,以及每个标签的数量。
例子或结果:
Tag(id1, label1), 7
Tag(id2, label2), 5
Tag(id3, label3), 2
我知道如何获取帖子的标签列表:
IList<Tag> tagList = session.CreateCriteria<Tag>()
.Add(Subqueries.PropertyIn("TagId",
DetachedCriteria.For<UserPostTag>()
.Add(Restrictions.Eq("Post.PostId", 17))
.SetProjection(Projections.Property("Tag.TagId"))
))
.List<Tag>();
你能帮帮我吗?
非常感谢!
抱歉我的英文......
此致
安托
答案 0 :(得分:0)
如果我是对的,请创建如下的HQL查询:
@"SELECT new Tag(tag.Id, tag.Label), count(cloud.User)
FROM UserPostTag cloud
JOIN cloud.Tag tag
WHERE cloud.Post.Id = :postId
GROUP BY tag.Id, tag.Label"
在CreateQuery调用中输入它,只有在Tag上有一个接受id和标签的构造函数时,它才有效。 (不要忘记设置postId参数。)
我相信这会返回一个包含数组中标记和列表的列表。
更新:如果这不起作用,您可以创建一个具有标记和计数的新类TagCount,并将选择语法更改为如下所示:
SELECT new TagCount(tag.Id, tag.Label, count(cloud.User))
(免责声明:我没试过。)
答案 1 :(得分:0)
如果我是你,我会为Post类创建一个额外的成员,将其命名为Tags并将其尽可能多地映射到UserPostTag表。在这种情况下,您可以使用以下代码完成任务:
创建课程以检索结果:
class TagWithCount
{
public string Label {get;set;}
public int Count {get;set;}
}
创建查询(使用QueryOver):
Tag ta = null;
TagWithCount res = null;
var query = QueryOver.Of<Post>()
.JoinAlias(x=>x.Tags, ()=>ta)
.SelectList(x=>x.SelectGroup(() => ta.Label).WithAlias(() => res.Label),
.SelectCount(p=>p.Id).WithAlias(() => res.Count))
.Where(x=>x.Id == postId)
.TransformUsing(Transformers.AliasToBean<TagWithCount>());
选择实际结果:
var res = query.GetExecutableQueryOver(session).List<TagWithCount> ();
P.S。:我没有检查代码是否完全正确,只是提出一个想法。