hibernate - HQL 按多对多集合属性排序

标签 hibernate hql

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

<set name="likedPosts" lazy="true" table="Likes" where="Deleted=0">
        <cache usage="read-write"/>
        <key column="UserID"/>
        <many-to-many column="PostID" class="Post"/>
    </set>

目前我有一个简单的 HQL 查询来返回喜欢的帖子列表,如下所示:

"select user.likedPosts from User user where user.id=:uid"

我想要的是让这个列表按 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

关于hibernate - HQL 按多对多集合属性排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12780701/

相关文章:

java - 使用 group by 连接的 SQL 的 HQL 版本

hibernate - HQL - 只加入一个子类

java - Hibernate (mysql) 为同一个查询返回不同的结果

java - Spring boot jpa/hibernate 遇到列类型错误(json字段)

mysql - 将 MYSQL 查询转换为 HQL

java - 在实际调用之前获取存储库查询的行数

java - Hibernate - 通过一次保存映射三个表

java - 带返回列表 hibernate 的调用过程

java - Spring 5 至少必须存在一个 JPA 元模型

spring - hibernate - 如果父级设置了级联,则无法删除子级