【问题标题】:JPA null parametersJPA 空参数
【发布时间】:2020-03-24 18:04:41
【问题描述】:

我需要获取与参数匹配的所有行,如果为空,则获取所有行

我(未)找到了读取 Spring Data documentation 的解决方案 - 示例 21。使用不同的可空性约束

尝试了使用注解@Nullable的示例,但仍然不起作用,这是代码

// just a part of entity LotMaster 
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "lot_master_gen")
@SequenceGenerator(name = "sq_lot_master_gen", sequenceName = "sq_lot_master", allocationSize = 1)
@Column(name = "lot_id")
private Long id;

//repository extends JpaRepository<LotMaster, Long>
@Nullable
Page<LotMaster> findAllById(@Nullable Long id, Pageable p);

查询:

SELECT
   *
FROM
   (
      SELECT
         lot0_.lot_id              AS lot1_2_,
         lot0_.qty                 AS qty_2_,
         lot0_.version             AS version8_2_,
         lot0_.username            AS username15_2_
      FROM
         lot_master lot0_
      WHERE
         lot0_.lot_id IS NULL
   )
WHERE
   ROWNUM <= ?

如你所见,它使用空值作为条件而不是忽略它

Pic Documentation

怎么可能?任何没有 CriteriaApi 或使用 @Query 的想法 我的想法是添加更多参数并使用派生查询

可能相关DATAJPA-209

我意识到以 id 为例会造成混淆,对此感到抱歉。 但是,如果我使用像 qty 这样的另一个字段,我应该有可能 即使使用 null 也可以搜索。在一个表单中可以留下多个字段 空。像@RequestParam 这样的实现会很好,需要 或 defaultValue 参数或只是 @Nullable 工作

【问题讨论】:

  • DATAJPA-209 票证是关于数据库中= NULLIS NULL 的不同语义。如果你能在没有@Query 的情况下做到这一点,我会真的感到惊讶,即使你能做到,也只会令人困惑。
  • 不要。如果您想这样做,或者如果没有id,请使用谓词,请使用常规findAll。但请不要尝试编写一个单一的查询方法来统治它们。
  • @M.Deinum 我意识到以id 为例会造成混淆,对此感到抱歉。但是,如果我使用像 qty 这样的另一个字段,我应该有可能即使使用 null 也可以进行搜索。在表单中可以留空的多个字段。像@RequestParam 这样带有requireddefaultValue 参数的实现会很好,或者只是@Nullable 工作
  • @Kayaman 这也指的是 如果将空值传递给查询方法,则生成的 JPQL 包含“= NULL”条件,该条件始终为 false。我>
  • @MikeyMargotrin 正是我所指的。

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


【解决方案1】:

您将必须 findAllByIdOrId(@Nullable Long id, Long id2) 并将 null 作为参数之一传递。使用@Query 有点枯燥且更容易处理。

另一种方法是使用findAllByIdOrIdIsNull(Long id),但这会失败

【讨论】:

    猜你喜欢
    • 2013-06-02
    • 2018-05-08
    • 2019-07-02
    • 2021-11-13
    • 1970-01-01
    • 2022-12-19
    • 2015-07-25
    • 2018-03-19
    相关资源
    最近更新 更多