【发布时间】: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