Hibernate HQL按多对多集合属性排序

Hibernate HQL按多对多集合属性排序,hibernate,hql,Hibernate,Hql,我有一个名为User的hibernate对象,它与另一个名为Post的hibernate对象有多对多关系。这种关系称为likedPosts(从用户的角度) 我想让这个列表按Post对象(特别是Post id)中的属性排序。我(天真的)尝试是这样的: "select user.likedPosts from User user where user.id=:uid order by user.likedPosts.id desc" 但这不起作用-我得到一个例外,告诉我我不允许这

我有一个名为
User
的hibernate对象,它与另一个名为
Post
的hibernate对象有多对多关系。这种关系称为
likedPosts
(从
用户的角度)

我想让这个列表按
Post
对象(特别是Post id)中的属性排序。我(天真的)尝试是这样的:

"select user.likedPosts from User user where user.id=:uid 
        order by user.likedPosts.id desc"
但这不起作用-我得到一个例外,告诉我我不允许这样做。我该怎么做呢?谢谢

错误的堆栈跟踪:

org.hibernate.QueryException: illegal attempt to dereference collection [user0_.ID.likedPosts] with element property reference [id] [select user.likedPosts from com.pashash.domain.User user where user.id=:uid order by user.likedPosts.id desc]
    at org.hibernate.hql.ast.tree.DotNode$1.buildIllegalCollectionDereferenceException(DotNode.java:46)
    at org.hibernate.hql.ast.tree.DotNode.checkLhsIsNotCollection(DotNode.java:513)
    at org.hibernate.hql.ast.tree.DotNode.resolve(DotNode.java:221)
    at org.hibernate.hql.ast.tree.FromReferenceNode.resolve(FromReferenceNode.java:94)
    at org.hibernate.hql.ast.tree.FromReferenceNode.resolve(FromReferenceNode.java:90)
    at org.hibernate.hql.ast.HqlSqlWalker.resolve(HqlSqlWalker.java:728)
    ...

要做到这一点,您需要显式联接:

select post from User user
inner join user.likedPosts post
where user.id = :userId
order by post.id desc

打印excpetion的stacktrace。为什么不让用户使用会话。获取并查看他的喜好(并在内存中排序)?这将是更多的OO风格,等等。。。当用户和他喜欢的人已经在内存中时,速度可能会更快。问得好。两个原因:首先,我希望能够限制从数据库返回的like的数量(这是
createQuery
允许我做的)。第二,这个查询的结果将由hibernate缓存在二级缓存中,因此,我猜在每次请求时使用它比使用它更有效。谢谢,我希望避免使用显式连接,但这完美地解决了我的问题!答案中的输入错误:应该是
where user.id=:userId
org.hibernate.QueryException: illegal attempt to dereference collection [user0_.ID.likedPosts] with element property reference [id] [select user.likedPosts from com.pashash.domain.User user where user.id=:uid order by user.likedPosts.id desc]
    at org.hibernate.hql.ast.tree.DotNode$1.buildIllegalCollectionDereferenceException(DotNode.java:46)
    at org.hibernate.hql.ast.tree.DotNode.checkLhsIsNotCollection(DotNode.java:513)
    at org.hibernate.hql.ast.tree.DotNode.resolve(DotNode.java:221)
    at org.hibernate.hql.ast.tree.FromReferenceNode.resolve(FromReferenceNode.java:94)
    at org.hibernate.hql.ast.tree.FromReferenceNode.resolve(FromReferenceNode.java:90)
    at org.hibernate.hql.ast.HqlSqlWalker.resolve(HqlSqlWalker.java:728)
    ...
select post from User user
inner join user.likedPosts post
where user.id = :userId
order by post.id desc