如何仅对.on中的语句进行联接或将联接转换为等效的satament?

问题描述

我想在同一张桌子上的桌子上做一个简单的左联接。

public class User extends BaseEntity<User> {

  public static final String PARENT_FIELD = "parent";

  @OnetoOne(fetch = LAZY)
  @JoinColumn(name = "parent_id")
  User parent;
}

我在BaseEntity中有id列

我的标准代码是:

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Long> query = cb.createquery(Long.class);
Root<User> root = query.from(User.class);
Join<User,User> userJoin = root.join(PARENT_FIELD,JoinType.LEFT);

....some other joins 

userJoin .on(
cb.equal(userJoin.getParent().get(PARENT_FIELD).get(ID_FIELD),root.get("id")),cb.equal(userJoin.get(ID_FIELD),root.get("id"))
);

....groupBy

...Heaving

问题是我在日志中看到此sql语句:

select
user0_.id as col_0_0_
from
user user0_
left outer join
user user2_
on user0_.parent_id=user2_.id !!!! this genrated from join!!! its excess. I just need
and (                                                                         only from sql!     
user0_.parent_user_id=user0_.id  <- this need or stament
and user2_.id=user0_.id
)

我想要的sql

select * from user p
left outer join user p1 on p.id = p1.parent_id or p.id = p1.id

我如何在没有条件的情况下制作标准鳕鱼?要么!!加入id字段,它也会帮助云... 我尝试在id上加入,但抛出了我无法在基本类型上加入的错误。 另一种方法是转换为select ... where或其他等效的条件...

解决方法

尝试一下:

ENTITY

public class User extends BaseEntity<User> {

  public static final String PARENT_FIELD = "parent";
  public static final String CHILDRENS_FIELD = "childrens";

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

  //Define bidirectional relation
  @OneToMany(mappedBy = "parent",fetch = FetchType.LAZY,cascade = {})
  private List<User> childrens;
}

标准

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Long> query = cb.createQuery(Long.class);
Root<User> root = query.from(User.class);
Join<User,User> userJoin = root.join(CHILDRENS_FIELD,JoinType.LEFT);

....some other joins 

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

....groupBy

...Heaving

在定义双向关系时,初始化时创建的Join随您所希望的是User子级,而不是父级。

Join的on方法上,添加条件,以便将其封装在cb中。否则应根据需要生成查询。