我使用JPA 2.0和Hibernate 4.1.0.Final。我有這個在我的Hibernate實體...JPA:如何爲集合中的項目編寫訂單子句?
@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;
在其地址實體擁有這一領域:
@Column(name = "email")
private String email;
如何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)
編輯:這裏是粗略的代碼,我在我的評論中列出的錯誤建議,安德烈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);
http://www.objectdb.com/java/jpa/query/jpql/order檢查最後的解決方案 – Zeus
在此鏈接中,它是否使用CriteriaBuilder處理集合中單個元素的排序? – Dave