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