【问题标题】:JPA/JPQL - Many-to-many relation - OrderBy doesn't workJPA/JPQL - 多对多关系 - OrderBy 不起作用
【发布时间】:2018-04-04 22:16:44
【问题描述】:

我有一个用户和一个角色类:

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @OrderBy("name")
    @ManyToMany(fetch=FetchType.EAGER)
    private SortedSet<Role> roles;
}

@Entity
public class Role {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    private String name;
}

这会产生三个数据库表:

User
+ id

Role
+ id
+ name

User_Role
+ users_id
+ roles_id

现在我想通过 JPQL 查询用户并按角色名称对他们进行排序:

SELECT u FROM User u ORDER BY u.roles ASC

我的数据库是 MariaDB。不幸的是,Hibernate 会生成以下原生且无效的查询:

select us0_.id as id2_2_ from User us0_ cross join User_Role roles1_, Role role2_ where us0_.id=roles1_.users_id and roles1_.roles_id=role2_.id order by . ASC

按 . ASC 显然不是有效的查询部分。我究竟做错了什么?我还尝试了@OrderColumn 和@org.hibernate.annotations.OrderBy,但没有成功。

谢谢!

【问题讨论】:

  • 是否可以像 roles 一样同时拥有 @OrderBy 和在 JPQL 中订购?我想按Collection 排序是不行的。对于@OrderBy,请参阅@OrderBy not working properly in JPA
  • 您正在订购用户记录,因此显然无法通过某些 Set 字段订购!
  • 首先你需要明确你想要订购什么。如上所述,按集合排序本身没有任何意义。您想对其大小、最小 id、平均名称进行排序吗?

标签: hibernate jpa spring-data-jpa mariadb jpql


【解决方案1】:

注解 OrderBy 对 JPQL 没有任何影响。如果想通过 JPQL 查询用户并按角色名排序,可以在 JPQL 中使用 join:

SELECT u FROM User u join u.roles r ORDER BY r.name ASC

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-11
    • 2020-11-26
    • 1970-01-01
    • 2017-07-07
    • 2018-06-22
    • 2013-06-17
    • 2011-02-23
    相关资源
    最近更新 更多