在crudRepository中使用外键进行Spring启动

时间:2017-06-15 11:49:47

标签: spring-boot spring-data-jpa

我有3个实体

  • CarWashWash设置)
  • Washcar_wash_id FK到CarWash
  • WashCommentwash_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?

1 个答案:

答案 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可以在附近玩......)