【问题标题】:Spring Data JPA and NULL filter, if Double field value is null nothing is returnedSpring Data JPA 和 NULL 过滤器,如果 Double 字段值为 null,则不返回任何内容
【发布时间】:2018-07-23 03:07:04
【问题描述】:

我有一个数据 JPA 实体,其中包含一个“价格”类型 Double。现在,用户需要能够根据该字段(最小值和最大值之间)过滤记录。现在的问题是,对于某些记录,数据库中的值可能为空。我的数据 JPA 存储库使用原生查询,例如“price BETWEEN :priceFrom AND :priceTo”。现在,如果用户未在过滤条件中指定任何内容,则应返回所有记录,包括价格为空的记录。但是,此查询不会返回这些记录。我知道,我可以使用查询“price IS NULL”创建一个新方法,并检查我的服务层中的过滤器值,如果未指定任何内容,则调用 null 版本。但是,我有多个具有相同要求的字段,这会导致需要维护很多重复的方法。有没有更好的方法来处理这种情况?

【问题讨论】:

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


【解决方案1】:

在我看来,你可以指定

(:priceFrom is null and :priceTo is null and price is null)
OR price between :priceFrom and :priceTo

如果输入priceFrompriceTo,则使用OR的第二部分,否则选择price为空的记录

【讨论】:

  • 这很有帮助,但与我正在寻找的东西不完全相同。如果该值存在,则不应返回 null。但是在这里,总是会返回空值,
【解决方案2】:

由于您使用的是 Spring Data JPA - 规范应该会为您解决这个问题。这是一个基于 JPA 标准的解决方案。 对于任何足够复杂的 API - 通过非常简单的字段搜索/过滤您的资源是不够的。查询语言更加灵活,允许您准确筛选出您需要的资源。因此,您应该能够轻松地为 NULL(在您当前需要的场景中)和您可能需要的任何其他内容进行编程。

这可针对多个字段进行扩展,并且易于编码/配置。有几个链接可以让您更深入地了解它

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-13
    • 1970-01-01
    • 2012-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    相关资源
    最近更新 更多