当前位置: 首页 > 知识库问答 >
问题:

如何在JPA或Hibernate中使用criteria builder连接同一个表来选择值

苏波涛
2023-03-14

我们的表中有以下员工数据,我们需要找到标志为false的所有员工,如果报告人标志为true,即使该标志为false,我们也应该排除经理

样本数据

 id  name  manager_name flag

 1   a     null         false
 2   b     a            true
 3   c     d            false
 4   e     null         false
 5   f     e            false

输出应为

 id  name  manager_name flag

 3   c     d            false
 4   e     null         false
 5   f     e            false

如何使用Hibernate Criteria builder实现上述要求?

在SQL中,这是使用下面的查询实现的

select * from employee where flag = false and id not in (
        select e1.id from employee e1, employee e2 where e1.name = e2.manager_name 
     and e2.flag= true) 

共有1个答案

公西姚石
2023-03-14

添加到Employee类---

 @ManyToOne(fetch = FetchType.LAZY)
 @JoinColumn(name="managerName", referencedColumnName="name",insertable=false, 
 updatable=false)
 private Employee manager;

条件查询---

 CriteriaBuilder cb  =  em.getCriteriaBuilder() ;
 CriteriaQuery<Employee> cq = cb.createQuery(Employee.class);
 Root<Employee> root =  cq.from(Employee.class);

 Subquery<Integer> sub = cq.subquery(Integer.class);
 Root<Employee> subRoot = sub.from(Employee.class);
 Join <Employee,Employee> empJoin = subRoot.join("manager",JoinType.INNER);
 Predicate subP2 = cb.equal(subRoot.get("flag"),true);
 sub.where(subP2);
 sub.select(empJoin.get("id"));

 Predicate flagP =  cb.equal(root.get("flag"),false);
 Predicate idNot  = cb.not(root.get("id").in(sub)) ;
 Predicate finalP  = cb.and(flagP,idNot);
 cq.where(finalP);

 TypedQuery<Employee>query = em.createQuery(cq.select(root));
 List<Employee> result = query.getResultList();

Hibernate查询生成---

select
    employee0_.id as id1_0_,
    employee0_.flag as flag2_0_,
    employee0_.manager_name as manager_3_0_,
    employee0_.name as name4_0_ 
from
    employee employee0_ 
where
    employee0_.flag=? 
    and (
        employee0_.id not in  (
            select
                employee2_.id 
            from
                employee employee1_ 
            inner join
                employee employee2_ 
                    on employee1_.manager_name=employee2_.name 
            where
                employee1_.flag=?
        )
    )
 类似资料:
  • 问题内容: 我正在尝试使用hibernate条件生成器连接4个表。 下面分别是这些表。 在这4个表中,我想为MySQL执行以下sql脚本: 那么,如何使用Hibernate CriteriaBuilder实现这一目标?请帮助… 预先感谢....... 问题答案: CriteriaBuilder cb = entityManager.getCriteriaBuilder(); CriteriaQue

  • 问题内容: 该表包含一个ID列,valueHeading列和一个value列。我想将value列分为两个新列,分别称为valueHeading1和valueHeading2,具体取决于值具有哪种valueHeading类型。 所以我想加入这个选择: 编辑:完全加入 使用此选择: 在各自的ID上。我该怎么做呢? 编辑 以说明我要执行的操作: 原始表格: 新表: 问题答案: 在SQLServer200

  • 我想使用JPA 2.0 CriteriaBuilder创建以下SQL查询: 以下是我的课程: Profil: 角色: 角色简介: 我想做的是创建一个函数,使用JPA通过ID获取。 这是我开始做的,但我对JPA是新手,我不知道该怎么做: 我该怎么做?

  • 我有一个带有3列的示例MyTable-id、common_id、creation_date,其中common_id分组条目。 现在,我想使用CriteriaBuilder从每个组中选择所有最新的条目(即每个常见的\u id获取最新的创建日期)。 SQL查询如下所示: 现在我尝试通过编写类似(cb是CriteriaBuilder,root是Root)的内容来创建place谓词: 但不幸的是。数组不是

  • 我的本机查询将类似于:“select*from a inner join b inner join c on a.ida=b.idb and b.lastname=c.lastname and a.name=c.name” 在hibernate中,如果要连接两个表,可以使用@joincolum,如果要通过表B连接表A和表C,可以使用@joincable。 因此在HQL中查询将看起来像:“from