2017-09-14 74 views
0

是否有可能(以及如何)创建一个条件查询,该条件查询会生成一个元素或数组,其中某些元素是来自集合值属性的集合?包含集合值属性的条件查询

鉴于其有名称的List<SubEntities>subs

class Dummy { 
    String name; 
    List<SubEntity> subs; 
} 

class SubEntity { 
    // some attributes 
} 

我希望有一个标准API查询与结构导致一些

元组>

Array而不是实体DummyTuple会很好,对于ArrayList也是如此。

我尝试以下:

CriteriaBuilder cb = em.getCriteriaBuilder(); 

CriteriaQuery<Object[]> q = cb.createQuery(Object[].class); 
Root<DummyEntityWithCollection> root = q.from(DummyEntityWithCollection.class); 
Join<Object, Object> subs = root.join("subs"); 
q.select(cb.array(root.get("name"), subs)); 

List<Object[]> list = em.createQuery(q).getResultList(); 

但是包含在listObject[] s与第二元件SubEntity s,而不是List<SubEntity>

以同样的方式这一次失败:

CriteriaBuilder cb = em.getCriteriaBuilder(); 

CriteriaQuery<Tuple> q = cb.createTupleQuery(); 
Root<DummyEntityWithCollection> root = q.from(DummyEntityWithCollection.class); 
Join<Object, Object> subs = root.join("subs"); 
q.multiselect(root.get("name"), subs); 

List<Tuple> list = em.createQuery(q).getResultList(); 

这种变异

CriteriaBuilder cb = em.getCriteriaBuilder(); 

CriteriaQuery<Object[]> q = cb.createQuery(Object[].class); 
Root<DummyEntityWithCollection> root = q.from(DummyEntityWithCollection.class); 
q.select(cb.array(root.get("name"), root.get("subs"))); 

List<Object[]> list = em.createQuery(q).getResultList(); 

完全不和导致一个无效的SQL语句单一.作为一个选择列工作(至少对于Hibernate和HSQLDB来说)。

问题How can I retrieve a collection property using criteria Api似乎表明,这是不可能的,但它基于Hibernate,我想获得基于JPA的答案。特别是指出JPA规范部分明确表示不可能的答案,我们将不胜感激。

回答

1

JPQL defines在4.8节作为

select_clause ::= SELECT [DISTINCT] select_item {, select_item}* 
select_item ::= select_expression [[AS] result_variable] 
select_expression ::= single_valued_path_expression | scalar_expression | aggregate_expression | identification_variable | OBJECT(identification_variable) | constructor_expression 

SELECT子句,所以你可以看到,多值表达式在JPQL选择。

标准只是一种使用API​​和对象创建查询的方法。请参阅JPA规范第6.1章:

条件查询的语义旨在反映Java持久性查询 语言查询的语义。

因此,假定相同的约束适用于Criteria API是合理的。

+1

感谢您的指点。我添加了一些明确的参考和链接。 –