【问题标题】:Left outer join of unrelated entities with Criteria具有条件的不相关实体的左外连接
【发布时间】:2022-07-29 15:21:40
【问题描述】:

是否有可能创建一个条件查询,如果该实体未映射,则在另一个实体上执行外部联接?

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

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;

我可以用 Criteria 做到这一点吗?

【问题讨论】:

    标签: java hibernate jpa criteria


    【解决方案1】:

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

    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();
    

    【讨论】:

    • 我不想添加映射。这就是我明确要求无关实体的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-11
    • 1970-01-01
    • 2018-01-16
    • 2012-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多