Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过Java中的JPA2.1获得同时包含属性和列表的多选结果?_Jpa_One To Many_Projection - Fatal编程技术网

如何通过Java中的JPA2.1获得同时包含属性和列表的多选结果?

如何通过Java中的JPA2.1获得同时包含属性和列表的多选结果?,jpa,one-to-many,projection,Jpa,One To Many,Projection,目标是使用multiselect获取员工的名字、姓氏和待办事项列表: CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery<Tuple> q = cb.createTupleQuery(); Root emp = q.from(Employee.class); q.multiselect( emp.get("firstName").alias("fname"), emp.get("lastName")

目标是使用multiselect获取员工的名字、姓氏和待办事项列表:

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Tuple> q = cb.createTupleQuery();
Root emp = q.from(Employee.class);

q.multiselect(
    emp.get("firstName").alias("fname"),
    emp.get("lastName").alias("lname"),
    emp.get("toDoList").alias("toDoList")
).where(cb.equal(emp.get("id"), 12345));

List<Tuple> tuples = em.createQuery(q).getResultList();
Iterator<Tuple> iter = tuples.iterator();

while(iter.hasNext()){
    Tuple t = iter.next();
    //t.get("fName");     // returns String
    //t.get("lName");     // returns String
    //t.get("toDoList");  // returns String

    //?????
    //...

}
现在,我正在寻找一种聪明的方法来创建一个员工的实例,并设置其firstName、lastName和toDoList一次:

Employee employee = new Employee();
employee.setFirstName(...);
employee.setLastName(...);
employee.setToDoList(...); 

最好的方法是什么?如果我添加额外的关系(如FavoriteShongs),事情会变得更加复杂。

不幸的是,您必须为multiselect调用的每个组合编写代码,才能从元组列表中获取数据,而这些代码可能非常脏

使用一个查询获取关系存在主要缺点:

  • 用于读取数据的java代码将变得非常脏
  • 一个查询乍一看性能不错,但这将为每个获取的行检索重复的数据
因此,我实际上认为,在许多情况下(比如我的情况),执行单独的查询来获取数据是一种更好的方法。换句话说,我将避免混乱的代码,而是使用单选。得到的用于获取投影数据的代码更易于维护,可读性也更高。以下是我发现的一些重要链接:

JPQL的SQL与join-fetch

用户可能希望加载每个关系,但join获取每个关系 人际关系,尤其是每一对夫妻的关系都会导致 巨大连接(外部连接),获取大量重复数据 数据

2。获取JPQL中的联接

主要的缺点是我们需要编写额外的代码 它执行查询。但如果该实体拥有 多个关系,我们需要初始化不同的关系 不同的用例。在这种情况下,我们需要为每个 获取连接关系的必需组合。这可能会变得相当复杂 乱七八糟的

Employee employee = new Employee();
employee.setFirstName(...);
employee.setLastName(...);
employee.setToDoList(...);