2012-02-08 70 views
1

我使用的EclipseLink作爲JPA提供商。JPA多選

我希望做一個查詢來獲取我的一切,對應於某些IDs與網上一個條件查詢的名稱。

Root<UserAccount> root = criteria.from(UserAccount.class); 
List<Selection<?>> select = new ArrayList<Selection<?>>(); 
    for (MyElement element : list) { 
    Expression<String> firstName = root.get("firstName"); 
    Expression<String> lastName = root.get("lastName"); 
    Expression<Integer> id = root.get("id"); 
    select.add(criteria 
       .multiselect(
         firstName.alias(element.getId() + "_" 
           + element.getEntity() + "f"), 
         lastName.alias(element.getId() + "_" 
           + element.getEntity() + "l")) 
       .where(criteriaBuilder.equal(id, element.getAuthorId())) 
       .from(UserAccount.class) 
       .alias(element.getId() + "_" + element.getEntity())); 
} 
criteria.multiselect(select); 
TypedQuery<Tuple> q = em.createQuery(criteria); 
for (Tuple t : q.getResultList()) { 
     for (OverviewEntity element : list) { 
System.out.println("////" 
         + t.get(element.getId().toString() + "_"+element.getEntity()+"f", 
           String.class)); 

通過element.getId() + "_" + element.getEntity() + "f"我打算創建一個唯一的別名。

的問題是,我得到的是null。爲什麼?我應該如何在一個查詢中獲得所有這些信息(以便它不會耗時)?

+0

爲什麼要創建的(唯一的)別名?什麼是element.getEntity()? – perissf 2012-02-08 11:25:02

+0

@perissf這個想法是,當我得到結果時,我想知道所有結果都適合在哪裏。 'ID'還不夠,還有更多'@Transient'(不在數據庫中)信息。 – Dragos 2012-02-08 12:04:46

+0

這個設計看起來很複雜。我會寫一個簡單的查詢,返回給定集合中所有UserAccount記錄的Id。該resultList會附着PersistenceContext,你就可以得到您的瞬態性能沒有任何努力......沒有必要使用別名 – perissf 2012-02-08 12:59:23

回答

2

正如意見建議,我會去使用CriteriaBuilder和元模型像

List<Integer> myList = ....; // place here your ids 
TypedQuery<UserAccount> q = em.createQuery("select u from UserAccount u where u.id in (:myList)", UserAccount.class); 

或等效的查詢簡單的解決方案:

Root<UserAccount> root = q.from(UserAccount.class); 
Expression<Integer> exp = root.get(UserAccount_.id); 
Predicate predicate = exp.in(myList); 
criteria.where(predicate); 

的​​返回包含了所有連接實體實例到PersistenceContext。這意味着您可以毫不費力地獲得Transient屬性。

關於演出,有可能是隻喜歡當返回列表的大小是非常大的,或極端情況下的顯着差異時,你不得不重複這個查詢與高頻。但這需要深入分析。

8

你的代碼看起來很迷茫,過於複雜。

的JPQL

Select u.firstName, u.lastName, u.id from UserAccount u where u.id in (:ids) 

似乎工作,

在標準這是,

Root<UserAccount> root = criteria.from(UserAccount.class); 
criteria.multiselect(root.get("firstName"), root.get("lastName"), root.get("id")); 
criteria.where(criteriaBuilder.in(root.get("id"), criteriaBuilder.parameter("ids")); 
+0

感謝您提供的代碼。問題仍然是這樣的:一個「元素」可以是「A」型或「B」型。我可以找出它是什麼類型:'element.getEntity()'。當我得到結果時,我應該知道返回的id和它對應的firstName和lastName是否屬於A或B。這是問題所在,不僅僅是從數據庫中獲取字符串。 – Dragos 2012-02-08 17:41:30