【发布时间】: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 <= ?
如你所见,它使用空值作为条件而不是忽略它
怎么可能?任何没有 CriteriaApi 或使用 @Query 的想法 我的想法是添加更多参数并使用派生查询
可能相关DATAJPA-209
我意识到以 id 为例会造成混淆,对此感到抱歉。 但是,如果我使用像 qty 这样的另一个字段,我应该有可能 即使使用 null 也可以搜索。在一个表单中可以留下多个字段 空。像
@RequestParam这样的实现会很好,需要 或 defaultValue 参数或只是@Nullable工作
【问题讨论】:
-
DATAJPA-209票证是关于数据库中= NULL和IS NULL的不同语义。如果你能在没有@Query的情况下做到这一点,我会真的感到惊讶,即使你能做到,也只会令人困惑。 -
不要。如果您想这样做,或者如果没有
id,请使用谓词,请使用常规findAll。但请不要尝试编写一个单一的查询方法来统治它们。 -
@M.Deinum 我意识到以
id为例会造成混淆,对此感到抱歉。但是,如果我使用像qty这样的另一个字段,我应该有可能即使使用 null 也可以进行搜索。在表单中可以留空的多个字段。像@RequestParam这样带有required或defaultValue参数的实现会很好,或者只是@Nullable工作 -
@Kayaman 这也指的是 如果将空值传递给查询方法,则生成的 JPQL 包含“= NULL”条件,该条件始终为 false。我>
-
@MikeyMargotrin 正是我所指的。
标签: java spring hibernate spring-boot spring-data-jpa