首页 > 解决方案 > Crinteria Join make AND insetad of OR

问题描述

我的问题是我设置 cb.or 它做 cb 和.. cb 是 CriteriaBuilder 我的课程是:

public class User extends BaseEntity<User> {
public static final String CHILDREN_FIELD = "children";
public static final String PARENT_FIELD = "parent";

//Id column based in BaseEntity

OneToOne(fetch = LAZY)
JoinColumn(name = "parent_partner_id")
User parent;

OneToMany(mappedBy = "parent", fetch = LAZY,cascade = {})
private List<User> children;

我的标准代码是:

Root<User> root = query.from(User.class);
Join<User, User> userJoin = root.join(CHILDREN_FIELD, JoinType.LEFT);
userJoin.on(
cb.or(
cb.equal(userJoin.get(ID_FIELD), root.get("id")))
);

代码生成:

select
user0_.id as col_0_0_
from
user user0_
left outer join
user children2_
on user0_.id=children2_.parent_id
and (  <- i write OR in cb!! why it generates AND ?  
children2_.id=user0_.id
)

我该如何解决?为什么我的代码会生成 AND 语句?

标签: javacriteriahibernate-criteriacriteria-api

解决方案


可能那是因为您的or方法调用中有一个参数

cb.or(cb.equal(userJoin.get(ID_FIELD), root.get("id"))));

应该

cb.or(arg1, arg2); // arg1 OR arg2

推荐阅读