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

Java 如何在本机查询JPA中传递参数,java,sql,spring,jpa,spring-data-jpa,Java,Sql,Spring,Jpa,Spring Data Jpa,我有一个服务类,它通过调用带有carRepository.retrieveCars()的JPA存储库来接收汽车列表。存储库方法正在使用本机查询检索记录 public interface CarRepository extends JpaRepository<Car, String> { @Query(nativeQuery = true, value = "select *" + "fr

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

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

当您使用Spring数据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); 
    }
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); 
}

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

那当然不行。你为什么这么说。它应该是有效的。如果服务类将使用
carRepository.retrieveCars(1,2)
它将传递int 1和int 2,这不是我需要的,那么它在query中称为索引参数。我需要将vinNo和serialNo参数从服务传递到查询中。也许你的第一个解决方案会奏效。这是来自baeldung.com的。它应该是这样的:
typedqueryquery=em.createQuery(“从Employee e中选择e,其中e.empNumber=?1”,Employee.class);字符串empNumber=“A123”;Employee=query.setParameter(1,empNumber).getSingleResult()在索引参数?1处表示查询将把第一个变量的值放在?1所在的位置。因此,它将取变量carVinNo的值,并将其置于?1的位置。这同样适用于?2。SpringDataJPA将在后台为您做这件事。在JPA中搜索索引参数,您将了解第二个sol。它应该是
列表检索器(Long-vinNo,Long-serialNo)及其从服务调用
carRepository.retrieveCars(vinNo,serialNo)
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); 
}
carRepository.retrieveCars(vinNo, serialNo);