hibernate - Hibernate Criteria API 加入没有任何关联的实体
问题描述
我正在尝试编写与以下 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;
}
解决方案
可以使用笛卡尔积
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")
));
推荐阅读
- java - 将具有所有依赖项的 java 类复制到其他包
- filestream - Vala 文件二进制结构,如使用的 c fread
- javascript - 负索引如何在 lodash 的 _.includes 中工作?
- orm - Cakephp3的ORM命名约定
- flutter - 如何从 Flutter 中的数据结构内容创建小部件?
- android - Android 没有找到 .SO 库,尽管该文件存在
- android - RecyclerView 从不使用 kotlin 中的视图模型刷新
- sql - 将 DELETE 与 WITH 语句一起使用
- regex - Jenkins管道正则表达式模式不匹配
- ffmpeg - FFmpeg 无法从标准输入流式传输 AAC 文件?