Spring数据jpa:在投影字段上添加where子句

时间:2017-04-05 13:25:06

标签: spring hibernate jpa spring-data spring-data-jpa

我尝试将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);

但似乎我们不能混合规格和预测。

关于如何做到这一点的任何想法?谢谢:))

1 个答案:

答案 0 :(得分:1)

你不能在投影上这样做。只需在查询中添加WHERE子句,例如:

List<CarProjection> findByColor_Label(String label);

它可能不会在连接中添加where子句,但在将其应用于整个查询之后。但最终结果应该是一样的。

文档:http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.query-methods.query-property-expressions