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

在hibernate使用CriteriaBuilder时,如何立即向左添加条件,而不是作为where条件的一部分?

桂学
2023-03-14

我希望criteriabuilder立即用join(查询下面左1个join)进行置入和条件。但是当我把condition放在谓词中时,它会把if添加到final 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个答案

西门飞翮
2023-03-14

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

 类似资料:
  • 我看过一些代码,其中人们使用了带有两个“!”的条件子句s 这是我能找到的一些例子。 使用有什么好处超过?

  • 问题内容: 我有两个实体:和。我正在使用Hibernate 3.6。 如何使用休眠标准实现这一目标,最重要的是,我必须将其用于分页。 而“我的道”如下所示以显示jqgrid中的“问题”列表 公共列表showHelpDeskIssues(DetachedCriteria dc,int from,int size){ 对于简短的解释,请参考此问题,如何使用struts2-jqgrid插件在jqgrid

  • 查询DSL: 事实上,这段代码不起作用,我得到以下异常: 问题是条件子句是在方法-中指定的。 Spring Boot 2.0.2 Spring Data JPA 2.0.7 Hibernate5.2.16.final 查询DSL 4.1.4

  • 我正在使用Hibernate的Spring Boot框架。我想只在某些条件下显示数据库中的所有数据。这是我的查询 我想得到CLIENT_GROUP数据只有S的数据。我用了贝娄鳕鱼做春靴... > 我的仓库在下面 在服务中,我使用了下面的代码。。 上述方法返回所有数据。我只想得到具体的数据。怎么做?请帮帮我。。

  • 我想对group by子句和where子句使用hibernate标准。 就像我有一个sql这样: 在使用标准组BY时,我如何在hibernate投影中传递截断的日期。

  • 我试图左加入2表,而使用mysql"不在"条件。我的问题是,如果左连接是null,这意味着没有条目左连接,mysql不是在操作符不能正常工作。 这里有一个例子。 因为类型表中当前没有匹配的行。NOT IN操作员不工作。有什么解决办法吗?