【发布时间】:2020-07-04 17:45:39
【问题描述】:
我正在尝试编写与以下 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;
}
【问题讨论】:
-
为什么不能向域模型添加任何关系?通常为了提高效率,它应该设计得尽可能接近你的数据库表结构。
-
@SternK 我建议他们添加关系,但他们不想! :(
-
使用标准 api 以及 jpql/hql 假设您在域模型中具有所有必要的关系。如果您没有它们并且无法添加它们,唯一的方法是使用本机查询并尝试将输出结果映射到 dto 类。
-
我有一个本地查询,它工作正常。但是,他们特别想要 Criteria API 等效项。
-
他们实际上想要增量构建查询 - 取决于 where 子句表达式值是否为空。例如,根据用户在运行时在包含许多可选字段的表单中填写的字段构建动态查询。
标签: hibernate jpa criteria hibernate-criteria criteria-api