如何在本机查询 JPA 中传递参数

2022-09-04 21:34:56

我有一个服务类,它通过调用JPA存储库来接收汽车列表。存储库方法是使用本机查询来检索记录。carRepository.retrieveCars()

public interface CarRepository extends JpaRepository<Car, String> {
    @Query(nativeQuery = true,
           value = "select *" +
                   "from car_records")
 }
 List<Car> retrieveCars(); 

现在我想传递参数并在查询中使用它们。我假设我需要一些东西作为准备好的语句。但是,我不确定如何实现它。carRepository.retrieveCars(Long vinNo, Long serialNo)

public interface CarRepository extends JpaRepository<TRace, String> {
    @Query(nativeQuery = true,
           value = "select *" +
                   "from car_records" +
                    "where carVinNo = ?! and carSerialNo >= ?1")
 }
 
 query.setParameter(1, vinNo, 2,serialNo);   //this is certainly not correct implementation
 List<Car> retrieveCars(vinNo, serialNo); 

答案 1

当您使用Spring Data JPA时,有两种方法可以解决这个问题

1) 命名参数

public interface CarRepository extends JpaRepository<TRace, String> {
        @Query(nativeQuery = true,
               value = "select *" +
                       "from car_records" +
                        "where carVinNo = :vinNo and carSerialNo >= :serialNo")
     }
     List<Car> retrieveCars(@Param("vinNo") Long vinNo,@Param("serialNo") Long serialNo); 
    }

命名参数的弹簧文档

2) 索引参数

public interface CarRepository extends JpaRepository<TRace, String> {
    @Query(nativeQuery = true,
           value = "select *" +
                   "from car_records" +
                    "where carVinNo = ?1 and carSerialNo >= ?2")
 }
 List<Car> retrieveCars(Long vinNo, Long serialNo); 
}

来自 spring doc 的索引参数示例

然后从你的服务类中调用它

carRepository.retrieveCars(vinNo, serialNo);

这两种情况对您来说都是一样的。


答案 2

推荐