GoForum🌐 V2EX

DoytoQuery vs SpringDataJPA

f0rb · 2026-03-05 10:07 · 0 次点赞 · 0 条回复

SpringDataJPA 支持通过 findBy 方法构建查询语句,然而 findBy 方法构建的查询条件是固定的,不支持忽略值为 null 的参数对应的查询条件,这导致我们需要为每一组参数组合定义一个 findBy 方法。例如:

findByAuthor
findByAuthorAndPublishedYearGreaterThan
findByAuthorAndPublishedYearLessThan
findByAuthorAndPublishedYearGreaterThanAndPublishedYearLessThan

当条件变多时,方法名会变长,参数也会变多,并触发“长参数”坏味道。解决这一问题的重构方法是“引入参数对象”,即把所有的参数定义在一个对象里。同时,我们把 findBy 的方法名中对应查询条件的部分作为这个对象的字段名称,我们便能为每个字段构建一个查询条件,并且根据对象的赋值情况,动态地组合非空字段对应的查询条件组合为查询子句。

public class BookQuery {
    String author;
    Integer publishedYearGreaterThan;
    Integer publishedYearLessThan;
    //...
}

基于此对象,我们可以把所有的 findBy 方法合并为一个泛型方法,从而简化查询接口的设计。

0 条回复
添加回复
你还需要 登录 后发表回复

登录后可发帖和回复

登录 注册
主题信息
作者: f0rb
发布: 2026-03-05
点赞: 0
回复: 0