在使用CriteriaBuilder的hibernate中,如何将条件立即添加到左连接,而不是作为where条件的一部分?

在使用CriteriaBuilder的hibernate中,如何将条件立即添加到左连接,而不是作为where条件的一部分?,hibernate,join,jpa-2.0,criteria-api,Hibernate,Join,Jpa 2.0,Criteria Api,我希望criteriabuilder立即使用join(下面查询中的第一个左join)放置和设置条件。 但当我把条件放在谓词中时,它会将if添加到最后的where子句中 我想要这样的输出: select * from milestone milestone0_ left outer join disc_user_milestone_watch userswatch1_

我希望criteriabuilder立即使用join(下面查询中的第一个左join)放置和设置条件。 但当我把条件放在谓词中时,它会将if添加到最后的where子句中

我想要这样的输出:

select * from milestone milestone0_ left outer join disc_user_milestone_watch userswatch1_ on milestone0_.id=userswatch1_.milestone_id AND userswatch1_.disc_user_id=2 left outer join disc_user discuser2_ on userswatch1_.disc_user_id=discuser2_.id cross join campaign campaign3_ cross join department department4_ where milestone0_.campaign=campaign3_.id and milestone0_.department=department4_.id; select * from milestone milestone0_ left outer join disc_user_milestone_watch userswatch1_ on milestone0_.id=userswatch1_.milestone_id left outer join disc_user discuser2_ on userswatch1_.disc_user_id=discuser2_.id cross join campaign campaign3_ cross join department department4_ where milestone0_.campaign=campaign3_.id and milestone0_.department=department4_.id AND userswatch1_.disc_user_id=2; EntityManager em = Milestone.entityManager(); CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder(); CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(UserMilestoneWatchStatus.class); Root milestoneRoot = criteriaQuery.from(Milestone.class); Join milestonediscUserJoin = milestoneRoot.join("usersWatching", JoinType.LEFT); // this is used for extending the milestone table to the user table Expression userId = milestonediscUserJoin.get("id"); // id int currUserId = Integer.parseInt(params.get("currUserId").toString()); milestoneRoot.alias("x"); criteriaQuery.select(criteriaBuilder.construct(UserMilestoneWatchStatus.class, milestoneRoot, userId)); criteriaQuery.distinct(true); List predicatesList = new ArrayList(); predicatesList.add(criteriaBuilder.or(criteriaBuilder.equal(userId, currUserId), criteriaBuilder.isNull(userId))); criteriaQuery.where(criteriaBuilder.and(predicatesList.toArray(new Predicate[predicatesList.size()]))).orderBy(sort); 选择 * 从…起 里程碑式里程碑式里程碑式里程碑式里程碑式里程碑式里程碑式里程碑式里程碑式里程碑式里程碑式里程碑式里程碑式里程碑式里程碑式里程碑式里程碑式里程碑式里程碑式里程碑式里程碑式里程碑式里程碑式里程碑式里程碑式里程碑式里程碑式里程碑式里程碑 左外连接 光盘用户里程碑监视用户样本1 在milestone0.id=userswatch1.milestone\u id和userswatch1.disc\u user\u id=2上 左外连接 光盘用户光盘用户2 在userswatch1\uU.disc\u user\u id=discuser2\uU.id交叉点上 参加 竞选活动3_uu交叉 参加 部门4 哪里 milestone0.campaign=campaign 3.id 和milestone0_uu.department=department4_uu.id; 但在谓词中加入条件后,我在最后的where子句中得到了条件。 目前我是这样的:

select * from milestone milestone0_ left outer join disc_user_milestone_watch userswatch1_ on milestone0_.id=userswatch1_.milestone_id AND userswatch1_.disc_user_id=2 left outer join disc_user discuser2_ on userswatch1_.disc_user_id=discuser2_.id cross join campaign campaign3_ cross join department department4_ where milestone0_.campaign=campaign3_.id and milestone0_.department=department4_.id; select * from milestone milestone0_ left outer join disc_user_milestone_watch userswatch1_ on milestone0_.id=userswatch1_.milestone_id left outer join disc_user discuser2_ on userswatch1_.disc_user_id=discuser2_.id cross join campaign campaign3_ cross join department department4_ where milestone0_.campaign=campaign3_.id and milestone0_.department=department4_.id AND userswatch1_.disc_user_id=2; EntityManager em = Milestone.entityManager(); CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder(); CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(UserMilestoneWatchStatus.class); Root milestoneRoot = criteriaQuery.from(Milestone.class); Join milestonediscUserJoin = milestoneRoot.join("usersWatching", JoinType.LEFT); // this is used for extending the milestone table to the user table Expression userId = milestonediscUserJoin.get("id"); // id int currUserId = Integer.parseInt(params.get("currUserId").toString()); milestoneRoot.alias("x"); criteriaQuery.select(criteriaBuilder.construct(UserMilestoneWatchStatus.class, milestoneRoot, userId)); criteriaQuery.distinct(true); List predicatesList = new ArrayList(); predicatesList.add(criteriaBuilder.or(criteriaBuilder.equal(userId, currUserId), criteriaBuilder.isNull(userId))); criteriaQuery.where(criteriaBuilder.and(predicatesList.toArray(new Predicate[predicatesList.size()]))).orderBy(sort); 选择 * 从…起 里程碑式里程碑式里程碑式里程碑式里程碑式里程碑式里程碑式里程碑式里程碑式里程碑式里程碑式里程碑式里程碑式里程碑式里程碑式里程碑式里程碑式里程碑式里程碑式里程碑式里程碑式里程碑式里程碑式里程碑式里程碑式里程碑式里程碑式里程碑式里程碑 左外连接 光盘用户里程碑监视用户样本1 在milestone0_u0.id=userswatch1_u0.id上 左外连接 光盘用户光盘用户2 在userswatch1\uU.disc\u user\u id=discuser2\uU.id交叉点上 参加 竞选活动3_uu交叉 参加 部门4 哪里 milestone0.campaign=campaign 3.id 和milestone0_uu0.department=department4_uu0.id 和userswatch1.disc\u user\u id=2; 什么是添加和立即加入的条件的方法

我当前的代码如下所示:

select * from milestone milestone0_ left outer join disc_user_milestone_watch userswatch1_ on milestone0_.id=userswatch1_.milestone_id AND userswatch1_.disc_user_id=2 left outer join disc_user discuser2_ on userswatch1_.disc_user_id=discuser2_.id cross join campaign campaign3_ cross join department department4_ where milestone0_.campaign=campaign3_.id and milestone0_.department=department4_.id; select * from milestone milestone0_ left outer join disc_user_milestone_watch userswatch1_ on milestone0_.id=userswatch1_.milestone_id left outer join disc_user discuser2_ on userswatch1_.disc_user_id=discuser2_.id cross join campaign campaign3_ cross join department department4_ where milestone0_.campaign=campaign3_.id and milestone0_.department=department4_.id AND userswatch1_.disc_user_id=2; EntityManager em = Milestone.entityManager(); CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder(); CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(UserMilestoneWatchStatus.class); Root milestoneRoot = criteriaQuery.from(Milestone.class); Join milestonediscUserJoin = milestoneRoot.join("usersWatching", JoinType.LEFT); // this is used for extending the milestone table to the user table Expression userId = milestonediscUserJoin.get("id"); // id int currUserId = Integer.parseInt(params.get("currUserId").toString()); milestoneRoot.alias("x"); criteriaQuery.select(criteriaBuilder.construct(UserMilestoneWatchStatus.class, milestoneRoot, userId)); criteriaQuery.distinct(true); List predicatesList = new ArrayList(); predicatesList.add(criteriaBuilder.or(criteriaBuilder.equal(userId, currUserId), criteriaBuilder.isNull(userId))); criteriaQuery.where(criteriaBuilder.and(predicatesList.toArray(new Predicate[predicatesList.size()]))).orderBy(sort); EntityManager em=里程碑。EntityManager(); CriteriaBuilder CriteriaBuilder=em.getCriteriaBuilder(); CriteriaQuery-CriteriaQuery=criteriaBuilder.createQuery(UserMilestoneWatchStatus.class); Root milestoneRoot=criteriaQuery.from(Milestone.class); Join milestonediscUserJoin=milestoneRoot.Join(“usersWatching”,JoinType.LEFT); //这用于将里程碑表扩展到用户表 表达式userId=milestonediscuserverjoin.get(“id”);//身份证件 int currUserId=Integer.parseInt(params.get(“currUserId”).toString(); milestoneRoot.别名(“x”); select(criteriaBuilder.construct(UserMilestoneWatchStatus.class,milestoneRoot,userId)); criteriaQuery.distinct(true); 列表谓词列表=新的ArrayList(); add(criteriaBuilder.or(criteriaBuilder.equal(userId,currUserId),criteriaBuilder.isNull(userId)); criteriaQuery.where(criteriaBuilder.and(predicatesList.toArray(新谓词[predicatesList.size()))).orderBy(排序);
什么是添加和立即加入的条件,而不是在何处?

不,没有办法。JPA2.0不支持join with ON子句。可能它会成为的一部分。

不,没有办法做到这一点。JPA2.0不支持join with ON子句。它可能是。

的一部分,作为旁白:没有标准,但在普通JPQL中,可以使用特定于Hibernate的
WITH
向联接添加附加子句,例如
left join disc\u user d WITH w.disc\u user\u id=d.id
。作为旁白:没有标准,但在普通JPQL中,您可以使用特定于Hibernate的
WITH
向联接中添加附加子句,例如
left join disc\u user d WITH w.disc\u user\u id=d.id