我有3个实体
CarWash
(Wash
设置)Wash
(car_wash_id
FK到CarWash
)WashComment
(wash_id
FK到Wash
)有没有办法写这个查询
@Query(value="select * from wash_comment where wash_comment.wash_id=(select wash_id from wash where wash.car_wash_id=2", nativeQuery=true))
List<WashComment> findAllByCarWashId(CarWash carWash)
不使用nativeQuery?
答案 0 :(得分:4)
处理JPA的建议:远离表,列和您拥有的所有RDBMS对象,并关注实体,它们的属性和关系。
如果我正确理解了您的问题,您可以让Spring Boot使用
自动解决它List<WashComment> findByWash_CarWash_Id($Parameter(name="id") int id)
方法签名 - _
具有.
之间及其属性的含义,遍历点 - 指定基于wash.carWash.id
的查找。所以这将转化为这样的东西:
select *
from WashComment wc
where wc.wash.carWash.id=:id
(放入@Query
注释中当然是完全有效的)
这假设您的WashComment和Wash对象如下所示:
public class WashComment {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private long id;
@OneToMany
private Wash wash;
//... left out for brevity
}
public class Wash {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private long id;
@OneToMany
private CarWash carWash;
//... left out for brevity
}
@Id
类的Wash
字段名为id
。
此处有关此类表达的更多信息:https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.query-methods.query-property-expressions
建议2 :如果您需要使用内部选择 - 尝试使用JOIN
重写它。在100次中有99次,这将是可能的,并且更具可读性,通常性能更高:
select wc.*
from wash_comment wc
join wash w on wc.wash_id=w.wash_id
where wash.car_wash_id=2
(免责声明:我现在不能尝试任何一种,没有任何JRE可以在附近玩......)