【发布时间】:2013-12-09 23:06:14
【问题描述】:
我正在使用 JPA 2.0 和 Hibernate 4.1.0.Final。我的 Hibernate 实体中有这个……
@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinTable(name = "user_address", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "address_id"))
private Set<Address> addresses;
其中Address实体有这个字段:
@Column(name = "email")
private String email;
考虑到用户可能根本没有链接到任何地址对象这一事实,我如何为用户对象的查询编写一个 order by 子句以按此集中的第一个电子邮件地址排序?我试过了
final CriteriaBuilder builder = m_entityManager.getCriteriaBuilder();
final CriteriaQuery<User> criteria = builder.createQuery(User.class);
final Root<User> user = criteria.from(User.class);
...
Expression orderByExpr = orderByRoot.get(orderByCol).get("addresses").get("email");
criteria.orderBy(orderByExpr);
但得到错误...
java.lang.IllegalArgumentException: Unable to resolve attribute [email] against path
at org.hibernate.ejb.criteria.path.AbstractPathImpl.unknownAttribute(AbstractPathImpl.java:116)
at org.hibernate.ejb.criteria.path.AbstractPathImpl.locateAttribute(AbstractPathImpl.java:221)
at org.hibernate.ejb.criteria.path.AbstractPathImpl.get(AbstractPathImpl.java:192)
at org.mainco.subco.user.repo.UserDaoImpl.addOrderByCol(UserDaoImpl.java:446)
at org.mainco.subco.user.repo.UserDaoImpl.buildFindUsersQuery(UserDaoImpl.java:342)
at org.mainco.subco.user.repo.UserDaoImpl.findUsers(UserDaoImpl.java:153)
at org.mainco.subco.user.repo.UserDao2IT.testFindOrderByEmail(UserDao2IT.java:558)
编辑:这是我按照 Andrei I 推荐的粗略代码。它会导致我在评论中列出的错误。
final CriteriaBuilder builder = m_entityManager.getCriteriaBuilder();
final CriteriaQuery<User> criteria = builder.createQuery(User.class);
final Root<User> user = criteria.from(User.class);
...
final Root<User> user = criteria.from(User.class);
Join<User, Address> addr = user.join("addresses", JoinType.LEFT);
orderByExpr = addr.get("email");
criteria.orderBy(builder.asc(orderByExpr));
…
return criteria.where(builder.and(…))
.select(user);
【问题讨论】:
-
在这个链接中,它在哪里使用 CriteriaBuilder 解决了集合中单个元素的排序问题?
标签: hibernate jpa sql-order-by jpa-2.0