【问题标题】:How to pass multiple query parameters in @Query in Spring Data JPA?如何在 Spring Data JPA 中的 @Query 中传递多个查询参数?
【发布时间】:2022-01-12 19:00:36
【问题描述】:

我在我的存储库中使用nativeQuery,它使用连接从多个表中获取数据,它还检查用户在查询中发送的输入。我的Repository 层看起来像:

@Query(
  value = "SELECT e.empname,c.countryName,r.RegionName
  FROM Employee e,Country c, Region r
  WHERE e.countryId=c.countryId
  AND c.regionId=r.regionId
  AND e.employeeId IN (:empIds)
  AND c.countryId IN (:countryIds)
  AND r.regionId IN (:regionIds)", 
  nativeQuery = true)
Collection<Object> findAllActiveUsersNative(CustomFilterRequest request,Pageable pageable);

以下是我的过滤器Class,它们是从 UI 发送的 ID 列表,并且该类的列表属性应发送到查询以进行进一步过滤。

class CustomFilterRequest{
List<Long> empIds,
List<Long> countryIds,
List<Long> regionIds,
}

我知道@Param 可以用于发送单个查询参数,但是如何像上述场景一样发送多个查询参数?有没有办法将这个类的属性映射到nativeQuery@Query中的查询参数?

【问题讨论】:

    标签: java spring-boot hibernate jpa spring-data-jpa


    【解决方案1】:

    如果您不强制将整个 CustomFilterRequest 对象作为单个参数传递,那么下面的呢?

    @Query(
      value = "SELECT e.empname,c.countryName,r.RegionName
      FROM Employee e,Country c, Region r
      WHERE e.countryId=c.countryId
      AND c.regionId=r.regionId
      AND e.employeeId IN :empIds
      AND c.countryId IN :countryIds
      AND r.regionId IN :regionIds", 
      nativeQuery = true)
    Collection<Object> findAllActiveUsersNative(
      @Param("empIds") List<Long> empIds,
      @Param("countryIds") List<Long> countryIds,
      @Param("regionIds") List<Long> regionIds,
      Pageable pageable);
    

    然后在你的服务类中:

    repository.findAllActiveUsersNative(
      customFilterRequest.getEmpIds(),
      customFilterRequest.getCountryIds(),
      customFilterRequest.getRegionIds(),
      pageable);
    

    【讨论】:

    • 我想到了这个。但是,有没有办法将对象作为查询参数传递?
    【解决方案2】:

    您可以使用SpEL expressions

      @Query(
          value = "SELECT e.empname,c.countryName,r.RegionName
          FROM Employee e,Country c, Region r
          WHERE e.countryId=c.countryId
          AND c.regionId=r.regionId
          AND e.employeeId IN (:#{#request.empIds})
          AND c.countryId IN (:#{#request.countryIds})
          AND r.regionId IN (:#{#request.regionIds})", 
          nativeQuery = true)
        Collection<Object> findAllActiveUsersNative(CustomFilterRequest request,Pageable pageable);
    

    【讨论】:

    • 假设Request Object中有Country Object,并且countryIDs在这个Country Object中。如何使用 SPEL 做到这一点?
    • 如果国家不是列表对象的类型,请使用 request.country.countryIDs。
    猜你喜欢
    • 2021-12-09
    • 2021-08-27
    • 1970-01-01
    • 2014-11-19
    • 2013-11-04
    • 1970-01-01
    • 2017-10-07
    • 2020-04-03
    • 1970-01-01
    相关资源
    最近更新 更多