我尝试将Spring数据JPA投影与连接列上的条件一起使用,但没有成功。
鉴于以下类别:
interface CarProjection {
String getName();
List<String> getColorsLabel();
}
class Car{
String name;
@OneToMany(mappedBy = "car")
List<Color> colors;
}
class Color{
String label;
@ManyToOne
Car car;
}
以下存储库方法:
List<CarProjection> findAllBy();
Everythings运行良好,spring会生成以下查询:
[....] left outer join color colors1_ on car0_.id=colors1_.car_id
我想要做的是在此连接上添加where子句,例如:
[....] left outer join color colors1_ on (car0_.id=colors1_.car_id AND colors1_.location='EXTERIOR')
在投影课上,它会给出类似的内容:
interface CarProjection {
String getName();
@Where("label=='EXTERIOR'")
List<String> getColorsLabel();
}
我知道我可以在@Value中使用spel表达式,但是spring会获取实体的所有列,而不仅仅是投影的列(开放投影)。
我还尝试将JPA规范与我的存储库中的投影结合起来:
List<CarProjection> findAllBy(Specification<CarProjection> specification);
但似乎我们不能混合规格和预测。
关于如何做到这一点的任何想法?谢谢:))
答案 0 :(得分:1)
你不能在投影上这样做。只需在查询中添加WHERE子句,例如:
List<CarProjection> findByColor_Label(String label);
它可能不会在连接中添加where子句,但在将其应用于整个查询之后。但最终结果应该是一样的。