2012-02-08 38 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