【问题标题】:Criteria query containing a collection valued property包含集合值属性的条件查询
【发布时间】:2017-09-14 08:44:07
【问题描述】:

是否可以(如果可以的话)创建一个条件查询,该条件查询会产生一个元组或数组,其中一些元素是来自集合值属性的集合?

给定一个实体Dummy,它有一个List<SubEntities>,名称为subs

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

class SubEntity {
    // some attributes
}

我想要一个标准 API 查询,它会产生具有结构的东西

元组>

Array 代替 Tuple 就可以了,Array 相同,List 类似。

我尝试了以下方法:

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();

但是list 中包含的Object[]s 的第二个元素是SubEntitys 而不是List&lt;SubEntity&gt;

这个同样失败:

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 规范中明确指出这是不可能的部分的答案将不胜感激。

【问题讨论】:

    标签: jpa criteria-api


    【解决方案1】:

    JPQL defines第4.8节中的select子句为

    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
    

    因此您可以看到多值表达式在 JPQL 中是不可选的。

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

    标准查询的语义旨在反映 Java Persistence 查询的语义 语言查询。

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

    【讨论】:

    • 感谢您的指点。我添加了一些明确的引用和链接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-20
    • 2015-06-07
    相关资源
    最近更新 更多