没有任何关联的Hibernate Criteria API连接实体

问题描述 投票:0回答:1

我正在尝试编写与以下SQL查询等效的Hibernate Criteria API:

select c.NAME         as carName,
   cc.COLOR_CODE      as colorCode,
   cc.COLOR           as color,
   c.DESCRIPTION      as desc,
   c.MANUFACTURE_YEAR as year
from CAR c
     LEFT JOIN CAR_COLOR CC on c.COLOR_CODE_ID = CC.ID
WHERE CC.COLOR_CODE = ?

这是我的Car实体

public class Car extends BaseEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String name;

    @Basic
    @Column(name = "MANUFACTURE_YEAR")
    private String year;

    @Basic
    @Column(name = "DESCRIPTION")
    private String desc;
    private Long colorCodeId;
    private String manufacturer;
}

这是我的CarColor实体

public class CarColor extends BaseEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String color;
    private String colorCode;
}

Car.colorCodeId是引用CarColor.id的外键。尽管没有明显的实体级关系,但我无法添加任何关系。

我想在这两个表/实体之间进行左联接,并将结果映射到CarSearch?我该怎么做?非常感激。

public class CarSearch {
    private String carName;
    private String colorCode;
    private String color;
    private String desc;
    private String year;
}
hibernate jpa criteria hibernate-criteria criteria-api
1个回答
0
投票
可以使用笛卡尔积

CriteriaBuilder cb = entityManager.getCriteriaBuilder(); CriteriaQuery<Object[]> query = cb.createQuery(Object[].class); Root<Car> car = query.from(Car.class); Root<CarColor> carColor = query.from(CarColor.class); Predicate joinPredicate = cb.equal(car.get("colorCodeId"), carColor.get("id")); query.multiselect( car.get("name"), carColor.get("colorCode"), carColor.get("color"), car.get("desc"), car.get("year") ).where( joinPredicate, cb.equal(carColor.get("colorCode"), "yourColorCode") );

为了避免查询结果中出现Object[],您应该使用适当的构造函数创建QueryResultDto类并使用这种方式

CriteriaQuery<QueryResultDto> query = cb.createQuery(QueryResultDto.class); //... query.select(cb.construct(QueryResultDto.class, car.get("name"), carColor.get("colorCode"), carColor.get("color"), car.get("desc"), car.get("year") ));

© www.soinside.com 2019 - 2024. All rights reserved.