Mysql 接口jparepository上的自定义方法

Mysql 接口jparepository上的自定义方法,mysql,hibernate,spring-boot,jpa,Mysql,Hibernate,Spring Boot,Jpa,我有两个实体:人和车。我想按使用JpaRepository的人的id列出汽车。我创建了双向关系,如下代码所示 public class Person { . . . @OneToMany(mapped = "person") @JsonManagedReference private List<Car> cars; . . . } 因此,我通过以下方式实现了JpaRepository以进行存储 public interface CarRepository extends JpaRe

我有两个实体:人和车。我想按使用JpaRepository的人的id列出汽车。我创建了双向关系,如下代码所示

public class Person {
.
.
.
@OneToMany(mapped = "person")
@JsonManagedReference
private List<Car> cars;
.
.
.
}
因此,我通过以下方式实现了JpaRepository以进行存储

public interface CarRepository extends JpaRepository<Car, Long> {
@Query("SELECT c FROM Car c WHERE c.person_id = :person_id")
 public List<Car> getCarsByidPerson(@Param("person_id")long idPerson);
}
我需要在select上使用join?或者这是可能的?

我明白了

查询中确实需要连接。遵循代码修复

public interface CarRepository extends JpaRepository<Car, Long> {
@Query("SELECT c FROM Car c INNER JOIN Person p ON (Car.person.id = Person.id) WHERE p.id = :person_id")
 public List<Car> getCarsByidPerson(@Param("person_id")long idPerson);
}
public interface CarRepository扩展了JpaRepository{
@查询(“在(Car.Person.id=Person.id)上从Car c内部连接Person p选择c,其中p.id=:Person\u id”)
公共列表getCarsByidPerson(@Param(“person_id”)long idPerson);
}

这不是连接,而是您现在已经编写了正确的JPQL,而不是SQL。默认情况下,该查询采用JPQL,并且
person\u id
是一个SQL构造。相反,您应该编写
从Car c中选择c,其中c.person.id=:person\u id
,它也会工作(由于属性路径
c.person.id
而不是sql column
c.person\u id
),Hibernate将从中推断连接。
org.hibernate.QueryException: could not resolve property: person_id of: com.jpa_study.Car [SELECT c FROM com.jpa_study.Car c WHERE c.person_id = :person_id]
public interface CarRepository extends JpaRepository<Car, Long> {
@Query("SELECT c FROM Car c INNER JOIN Person p ON (Car.person.id = Person.id) WHERE p.id = :person_id")
 public List<Car> getCarsByidPerson(@Param("person_id")long idPerson);
}