2013-12-09 23 views
0

我使用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); 
+0

http://www.objectdb.com/java/jpa/query/jpql/order檢查最後的解決方案 – Zeus

+0

在此鏈接中,它是否使用CriteriaBuilder處理集合中單個元素的排序? – Dave

回答

0

嘗試以下操作:

final CriteriaQuery<User> query = builder.createQuery(User.class); 
final Root<User> user = query.from(User.class); 
query.select(user);//this one was missed. 

SetJoin<User, Address> addr = user.joinSet("addresses", JoinType.LEFT); 

query.orderBy(builder.asc(addr.get("email"))); 

PS:作爲addresses字段是一組,它不下令,這意味着它並不清楚哪一個列表將被考慮。同樣在SQL中,您需要一些定義「第一個」元素的標準。

+0

嗨,我試過你的建議,但它導致了錯誤,「java.lang.IllegalStateException:沒有明確的選擇和隱含的一個感冒無法確定」。 – Dave

+0

這是另一個問題/問題,因爲您忘記選擇根目錄。我更新了我的答案,以解決這個問題。 –

+0

是的,我已經這樣做了。我編輯了我的答案,向您展示如何按照您提供的行插入訂單。如果我評論他們,一切正常(除了訂購),但如果我包括你的線,我得到了我列出的例外。 – Dave

相關問題