Criteria API - multiselect - 包含其他元组/集合的元组

时间:2013-10-15 07:22:41

标签: jpa eclipselink multi-select criteria-api

我有以下实体:

class Person {
   int id;
   String name;
   List<Address> addresses
}

class Address {
  int id;
  String city;
}

我尝试准备查询(基于Criteria-API),其中结果(结果列表中的每个元组)将包含三个元素:

  1. persron.id
  2. person.name
  3. person.addresses&lt; - 包含0个或更多元素的集合
  4. (1,“Peter”,Collection {2,3})或 (1,“Peter”,Tuple {2,3})

    我尝试过这样的事情:

    EntityManager em;
    CriteriaBuilder qb = em.getCriteriaBuilder();
    
    CriteriaQuery<Tuple> cq = qb.createTupleQuery()
    Root<Person> root = cq.from(Person.class);
    
    ListJoin<PersonalData, Address> join = (ListJoin)root.join("addresses", JoinType.LEFT);
    
    cq.multiselect(root.get("id"), root.get("name"), join.get("id"));
    
    TypedQuery<Tuple> tq = em.createQuery(cq);
    List<Tuple> result = tq.getResultList();
    

    但收到的结果与预期不同:(

    对于模特:人(1,“彼得”)

    有两个地址

    地址(2,“伦敦”); 地址(3,“巴黎”);

    我的结果列表类似于笛卡尔积:

    (1,“Peter”,2),(1,“Peter”,3)

    是否可以收到本帖子开头要求的结果?

1 个答案:

答案 0 :(得分:1)

不,它不能按照您期望的方式工作,因为人和地址之间的连接将导致每行一个地址,JPA将以类似的格式返回数据。每个元组中有一个person.id,person.name,person.address。为什么不直接返回Person实例并使用它?