SpringDataJPA支持通过findBy方法构建查询语句,然而findBy方法构建的查询条件是固定的,不支持忽略值为null的参数对应的查询条件,这导致我们需要为每一组参数组合定义一个findBy方法。例如:
findByAuthor
findByAuthorAndPublishedYearGreaterThan
findByAuthorAndPublishedYearLessThan
findByAuthorAndPublishedYearGreaterThanAndPublishedYearLessThan
当条件变多时,方法名会变长,参数也会变多,并触发“长参数”坏味道。解决这一问题的重构方法是“引入参数对象”,即把所有的参数定义在一个对象里,称为查询对象。同时,我们把findBy的方法名中对应查询条件的部分作为这个对象的字段名称,我们便能为每个字段构建一个查询条件,并且根据对象的赋值情况,动态地组合非空字段对应的查询条件组合为查询子句。
public class BookQuery {
String author;
Integer publishedYearGreaterThan;
Integer publishedYearLessThan;
//...
}
提出查询对象这一概念,并利用它来解决动态查询问题,这正是DoytoQuery的核心功能。