Jpa 标准API-multiselect-包含其他元组/集合的元组

Jpa 标准API-multiselect-包含其他元组/集合的元组,jpa,eclipselink,multi-select,criteria-api,Jpa,Eclipselink,Multi Select,Criteria Api,我有以下实体: class Person { int id; String name; List<Address> addresses } class Address { int id; String city; } 班级人员{ int-id; 字符串名; 列出地址 } 班级地址{ int-id; 字符串城市; } 我尝试准备查询(基于Criteria API),其中结果(结果列表中的每个元组)将包含三个元素: 个人识别码 人名 person.addr

我有以下实体:

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

class Address {
  int id;
  String city;
}
班级人员{
int-id;
字符串名;
列出地址
}
班级地址{
int-id;
字符串城市;
}
我尝试准备查询(基于Criteria API),其中结果(结果列表中的每个元组)将包含三个元素:

  • 个人识别码
  • 人名

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

    我的域实体包含一些不应该为其他系统组件公开的逻辑。因此,我尝试生成类似于动态DTO的东西。每个想了解数据模型的组件都可以调用方法,该方法将返回选定实体的选定信息。似乎您有一个非常好的对象模型,可以重用该模型来表示您的数据,而不是特定于某一目的的业务逻辑。无论如何,尽管这不是您想要的答案,但我认为您不会找到一种通过JPA查询在不返回实体的情况下获取集合集合的方法。很明显,业务模式不太好,但我无法改变它。应用程序是巨大的,这也是我试图围绕该模型分离模型和组件的原因。我想到的第一个想法就是在我的模型顶部准备DTO。使用CriteriaAPI的方法似乎不能解决我的问题。我将尝试使用JPA查询。谢谢你们的回复,伙计们。
    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();