【问题标题】:How to pass parameters in a native query JPA如何在本机查询 JPA 中传递参数
【发布时间】:2021-05-10 06:15:49
【问题描述】:

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

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); 

【问题讨论】:

    标签: java sql spring jpa spring-data-jpa


    【解决方案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); 
        }
    

    spring doc for named parameters

    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); 
    }
    

    example for index parameter from spring doc

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

    carRepository.retrieveCars(vinNo, serialNo);
    

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

    【讨论】:

    • 你为什么这么说。它应该可以工作。在查询中称为索引参数
    • 如果服务类将使用carRepository.retrieveCars(1, 2),它将传递 int 1 和 2,这不是我需要的。我需要将服务中的 vinNo 和 serialNo 参数传递给查询。也许您的第一个解决方案可能会奏效。这是来自 baeldung.com。应该是这样的:TypedQuery&lt;Employee&gt; query = em.createQuery("SELECT e FROM Employee e WHERE e.empNumber = ?1", Employee.class);String empNumber = "A123";Employee employee = query.setParameter(1, empNumber).getSingleResult();
    • 我们用不同的词表达相同的意思。您的 vinNo 和 serialNo 被称为变量,当您使用它们时,它们具有实际值。因此,在执行期间,您的 vinNo 可能具有值 1 或来自服务的其他值。我不确切知道服务类中变量的名称,因此我用实际值做了一个示例:D。你可以在你的服务中使用 carRepository.retrieveCars(vinNo, serialNo) 并且它是一样的。
    • 在索引参数 ?1 表示查询会将第一个变量的值放在 ?1 所在的位置。所以它将取变量 carVinNo 的值并将其放在 ?1 的位置。这同样适用于?2。 Spring Data JPA 将在后台为您完成。在JPA中搜索索引参数你就明白了
    • 在第二个溶胶中。它应该是 List&lt;Car&gt; retrieveCars(Long vinNo, Long serialNo); 并且它从服务中调用 carRepository.retrieveCars(vinNo, serialNo)
    猜你喜欢
    • 1970-01-01
    • 2021-08-26
    • 1970-01-01
    • 2013-11-04
    • 2019-05-01
    • 2017-08-06
    • 2021-11-11
    • 2018-03-02
    • 2021-11-18
    相关资源
    最近更新 更多