繁体   English   中英

具有条件的不相关实体的左外连接

[英]Left outer join of unrelated entities with Criteria

如果该实体未映射,是否可以以某种方式创建一个标准查询,该查询在另一个实体上执行外部联接?

我知道当您进行交叉连接并手动添加连接条件时,内部连接是可能的。 它看起来像这样:

CriteriaBuilder cb = getCriteriaBuilder();
CriteriaQuery<Tuple> cq = cb.createTupleQuery();

Root<Car> car = cq.from(Car.class);
Root<Color> color = cq.from(Ccolor.class);

cq.where(cb.equal(car.get("colorUuid"), color.get("uuid")));

但是,在我的情况下,我需要外部联接的行为。

所以假设我有这些实体:

class Car {
  @Column(name="color_uuid")
  private String colorUuid;
}

class Color {
  private String uuid;
  private String name;
}

可以说颜色是可选的,这就是我需要外连接的原因。 SQL 看起来像

SELECT * from car LEFT OUTER JOIN color ON car.color_uuid = color.uuid;

我可以用标准来做到这一点吗?

我建议您更改类以建立逻辑上已经存在的关系。

class Car {
    
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "color_uuid", referencedColumnName = "uuid")
    private Color color;
}

class Color {
    private String uuid;
    private String name;

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "color")
    private List<Car> cars;
}

然后您可以使用标准构建左连接:

CriteriaQuery<Car> criteriaQuery = criteriaBuilder.createQuery(Car.class);
Root<Car> root = criteriaQuery.from(Car.class);
root.join("color", JoinType.LEFT);
List<Car> cars = em.createQuery(criteriaQuery).getResultList();

你不能用标准 api 来做到这一点,我遇到了和你一样的问题。 交叉连接也无济于事。 我可以建议的是:

  1. 在数据库上使用左外连接创建一个视图,然后将 map 视图作为一个实体
  2. 进行 jpql 查询
  3. 进行本机查询

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM