【发布时间】:2015-01-09 20:06:58
【问题描述】:
我正在使用 Spring 3.2.11.RELEASE、Hibernate 4.3.6.Final 和 JPA 2.1。我有以下具有以下字段的实体......
@Entity
@Table(name = "user")
public class User implements Serializable, Comparable<User>
{
…
@ManyToMany
@JoinTable(name = "user_organization", joinColumns = { @JoinColumn(name = "USER_ID") }, inverseJoinColumns = { @JoinColumn(name = "ORGANIZATION_ID") })
@LazyCollection(LazyCollectionOption.FALSE)
@SortNatural
private SortedSet<Organization> organizations;
在上面,组织的排序是通过组织的名称字段完成的。当我运行 JPA 查询来检索用户对象时,我想根据与其关联的组织的有序列表进行排序。这个我试过了……
final CriteriaBuilder builder = m_entityManager.getCriteriaBuilder();
final CriteriaQuery<User> criteria = builder.createQuery(User.class);
…
final SetJoin<User, Organization> orgsJoin = orderByRoot.join(User_.organizations, JoinType.LEFT);
orderByExpr = orgsJoin.get(Organization_.name);
criteria.orderBy(builder.asc(orderByExpr);
但它不适用于用户与多个组织相关联的情况 - 有时,在其列表中具有按字母顺序排列较低组织的用户会在正确用户之前返回。如果不写一大堆原生 SQL,我怎么能用 JPA/CriteriaBuilder 解决这个问题?
编辑:这是我想要的一个例子。我正在寻找不同的用户。
- 用户 A 有组织,“AAA 大楼”和“ZZZ 大楼”
- 用户 B 的组织只有“MMM 大楼”
- 用户 C 拥有组织“CCC 大楼”和“VVV 大楼”
- 用户 D 拥有组织“AAA Building”和“MMM Buidling”
我想要用户 D、用户 A、用户 C 和用户 B,因为用户 A 的组织的串联按字母顺序低于用户 C 的组织的串联,而用户 C 的组织按字母顺序低于用户 B 的组织。
【问题讨论】:
-
那个 JPQL 生成的 SQL 是什么?
-
你只选择不同的用户吗?
-
“不用写一大堆原生 SQL” - 问题就在这里。您正在尝试使用一堆注释来解决 SQL 问题...
-
这是关于什么数据库的?
标签: java hibernate sorting jpa orm