下面给出了一个来自网络文章的代码片段,它描述了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();
}
}
}
}发布于 2019-12-28 09:35:09
它只是告诉JPA您想要做一个投影。
在你的例子中,部门的雇员。
这样,结果将包含第一行中的Employee实体和第二行中的Department实体。
https://stackoverflow.com/questions/59505070
复制相似问题