【问题标题】:Is it possible to use and combine WHERE clauses in Spring Data Rest?是否可以在 Spring Data Rest 中使用和组合 WHERE 子句?
【发布时间】:2020-01-30 20:35:32
【问题描述】:

我正在使用 Spring Boot、Spring Data 编写应用程序。我正在尝试根据不同的过滤器参数实现过滤功能。

我发现 Spring Data REST framework 开箱即用支持基本过滤操作,例如:

/myEntities?field1=value1&field2=value2&sort=field2,desc&size=10&page=2

在这种情况下,我们只过滤 2 个字段,没有任何额外的 where 子句。

但是,如果我需要一个更复杂的过滤器,它对我的​​实体具有不同数量的 where 子句、顺序、限制,该怎么办?结果查询可能如下所示:

SELECT * FROM table
WHERE field1 != `value1` and (field1 != ` value2 `OR (field1 = `value3` AND filed2 < 3))
AND field2 != 99

是否可以使用 Spring Data Rest 的内置功能来实现不同 where 子句的组合(将所有这些东西作为 http 参数发送)?

【问题讨论】:

  • 我不确定是否有可能用像现在这样简单的东西来实现你想要实现的目标。但是您可以尝试使用 Pageable 的规范。 this 可能会有所帮助
  • 没有。您将不得不推出自己的解决方案,或者可能调查 OData 实现是否可以处理此问题,例如Olingo baeldung.com/olingodocs.oasis-open.org/odata/odata/v4.01/csprd05/…

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


【解决方案1】:

您应该能够自定义您的存储库以使用包含所有必需参数的搜索方法。然后,它们将在搜索资源下与所有查询参数一起暴露给 Spring Data Rest。

类似:

@RestResource(path = "weirdFilter", rel = "weirdFilter")
@Query(value = "SELECT * FROM table
WHERE field1 != :value1 and (field1 != :value2 OR (field1 = :value3 AND field2 < 3))
AND field2 != 99")
public Page<Stuff> findByWeirdFilter(@Param("value1") String value1, @Param("value2") String value2, @Param("value3") String value3, Pageable p);

【讨论】:

    【解决方案2】:

    最终,我基于 library 使用了 Spring Data Jpa + RSQL(Rest Query Language)

    它允许使用嵌套的 where 子句即时执行任何过滤逻辑。 过滤器本身只是一个字符串:String filter = "field1=='val1' and (field2=='val2' and (field3 &gt; 56 or field4 &gt; 23))";,因此您可以传递任何过滤器(根据 rsql 正确构建,否则它将无法解析您的请求)并在需要时轻松修改它。

    lib 本身将给定的过滤器转换为规范或预测器(您可以选择),如果您需要,也可以很容易地将 limitorderBy 添加到最终请求中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-19
      • 1970-01-01
      • 1970-01-01
      • 2017-01-18
      • 1970-01-01
      • 2020-06-19
      • 1970-01-01
      相关资源
      最近更新 更多