【问题标题】:How to create a jpa query that takes multiple (dynamic) number of ranges for between clause to fetch results如何创建一个 jpa 查询,该查询需要多个(动态)范围的 between 子句来获取结果
【发布时间】:2020-02-22 01:39:15
【问题描述】:

我正在编写一个用于搜索记录的 JPA 本机查询。 我有一个表可以说“机器”,其中包含一个数字列“容量”,它存储机器的容量,搜索输入可以包含应该过滤机器的容量范围列表。

例如范围列表可以包含

  • 10 到 20
  • 25 到 30
  • 32 到 40

因此,应该获取容量在上述任何范围之间的机器。

这是我的本机查询,它仅适用于容量范围内的一个元素 如何使其动态化,以便支持多个这样的 capacityMin 和 capacityMax 值。

提前致谢。

    @Query(value = "SELECT * FROM machine m where m.status='A' " + 
            "and (:capacityMin IS NULL or (m.capacity>= :capacityMin and m.capacity<= :capacityMax))" , nativeQuery=true)
    public List<Object[]> searchMachines(@Param("capacityMin") Integer capacityMin,@Param("capacityMax") Integer capacityMax); 

【问题讨论】:

  • 我认为您可以在单个查询中执行此操作的唯一方法是使用 Criteria API 或 QueryDSL 来构建动态“或”子句。否则,您需要为每个范围调用一次查询。
  • 谢谢 Alan.. 我希望它在单个查询中,因为它还必须返回带有分页的结果。因此在多个查询的情况下维护起始偏移量、限制和计数会非常复杂。
  • 我建议然后看看 QueryDSL。 Spring data 开箱即用地支持它。它为您提供了非常强大的零代码查询功能。 docs.spring.io/spring-data/jpa/docs/current/reference/html/…
  • 感谢您的参考我会检查它。

标签: mysql spring-boot jpa spring-data-jpa nativequery


【解决方案1】:

当您有几个参数时,请使用您已经找到第一个参数的解决方案的解决方案

@Query(value = "SELECT * FROM machine m where m.status='A' " + 
            "and (:capacityMin IS NULL or (m.capacity>= :capacityMin ) " +
            "and (:capacityMax IS NULL or (m.capacity<= :capacityMax )" , nativeQuery=true)
    public List<Object[]> searchMachines(@Param("capacityMin") Integer capacityMin,@Param("capacityMax") Integer capacityMax); 

当您有许多可选参数时,您可以更好地使用已经提到的 Criteria API 或 QueryDSL

【讨论】:

  • 您的答案非常适合单个最小值和最大值范围。就我而言,它有多个这样的最小最大组合范围。并且没有定义我将从请求客户那里收到多少这样的组合。
  • @Query 注释适用于固定查询和固定数量的参数。在您的情况下,参数的数量是动态的。您应该使用 Alan Hay 已经提到的 QueryDSL 的 Criteria API。
猜你喜欢
  • 2019-10-05
  • 1970-01-01
  • 1970-01-01
  • 2020-12-02
  • 1970-01-01
  • 2014-11-02
  • 2018-10-27
  • 2014-06-20
  • 2023-04-02
相关资源
最近更新 更多