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
Hibernate JPA:将在查询结果中返回的选择项_Hibernate_Jpa - Fatal编程技术网

Hibernate JPA:将在查询结果中返回的选择项

Hibernate JPA:将在查询结果中返回的选择项,hibernate,jpa,Hibernate,Jpa,下面给出了一段来自的代码片段,描述了JPA标准API的Hibernate用法。我已经验证了代码的工作,没有任何问题。我的问题涉及语句criteriaQuery.multiselect(empRoot,deptRoot) 如果上面提到的方法是以“流畅的风格”调用的,我就没有问题了。但是,很明显,这个方法有副作用,因为如果我尝试注释掉它(因为结果没有存储在任何变量中),就会引发实时异常 那么调用criteriaQuery.multiselect(…)方法时,“引擎盖下”到底会发生什么呢? pack

下面给出了一段来自的代码片段,描述了JPA标准API的Hibernate用法。我已经验证了代码的工作,没有任何问题。我的问题涉及语句
criteriaQuery.multiselect(empRoot,deptRoot)

如果上面提到的方法是以“流畅的风格”调用的,我就没有问题了。但是,很明显,这个方法有副作用,因为如果我尝试注释掉它(因为结果没有存储在任何变量中),就会引发实时异常


那么调用
criteriaQuery.multiselect(…)
方法时,“引擎盖下”到底会发生什么呢?

package com.boraji.tutorial.hibernate;

import java.util.List;

import javax.persistence.criteria.*;

import org.hibernate.*;
import org.hibernate.query.Query;

import com.boraji.tutorial.hibernate.entity.Department;
import com.boraji.tutorial.hibernate.entity.Employee;

public class CriteriaQueryExample6 {

   public static void main(String[] args) {

      Transaction transaction = null;
      try (Session session = HibernateUtil.getSessionFactory().openSession()) {
         transaction = session.beginTransaction();

         CriteriaBuilder builder = session.getCriteriaBuilder();

         // Using FROM and JOIN
         CriteriaQuery<Object[]> criteriaQuery = builder.createQuery(Object[].class);
         Root<Employee> empRoot = criteriaQuery.from(Employee.class);
         Root<Department> deptRoot = criteriaQuery.from(Department.class);
         criteriaQuery.multiselect(empRoot, deptRoot);
         criteriaQuery.where(builder.equal(empRoot.get("department"), deptRoot.get("id")));

         Query<Object[]> query=session.createQuery(criteriaQuery);
         List<Object[]> list=query.getResultList();
         for (Object[] objects : list) {
            Employee employee=(Employee)objects[0];
            Department department=(Department)objects[1];
            System.out.println("EMP NAME="+employee.getName()+"\t DEPT NAME="+department.getName());
         }
         transaction.commit();
      } catch (Exception e) {
         e.printStackTrace();
         if (transaction != null) {
            transaction.rollback();
         }
      }
   }
}
package com.boraji.tutorial.hibernate;
导入java.util.List;
导入javax.persistence.criteria.*;
导入org.hibernate.*;
导入org.hibernate.query.query;
导入com.boraji.tutorial.hibernate.entity.Department;
导入com.boraji.tutorial.hibernate.entity.Employee;
公共类标准查询示例6{
公共静态void main(字符串[]args){
事务=空;
尝试(会话会话=HibernateUtil.getSessionFactory().openSession()){
事务=session.beginTransaction();
CriteriaBuilder=session.getCriteriaBuilder();
//使用FROM和JOIN
CriteriaQuery CriteriaQuery=builder.createQuery(对象[].class);
Root empRoot=criteriaQuery.from(Employee.class);
Root deptRoot=criteriaQuery.from(Department.class);
criteriaQuery.multiselect(empRoot,deptRoot);
其中(builder.equal(empRoot.get(“department”)、deptRoot.get(“id”));
Query Query=session.createQuery(criteriaQuery);
List=query.getResultList();
对于(对象[]对象:列表){
Employee=(Employee)对象[0];
部门=(部门)对象[1];
System.out.println(“EMP NAME=“+employee.getName()+”\t DEPT NAME=“+department.getName());
}
commit();
}捕获(例外e){
e、 printStackTrace();
if(事务!=null){
transaction.rollback();
}
}
}
}

它只是告诉JPA你想做一个投影

在你的情况下,员工,部门

这样,结果将在第一行包含一个员工实体,在第二行包含一个部门实体