创建查询

Spring Data repository自带了一个非常有用的查询构造器。它会从方法名中去掉类似find..By,read...By,query...By,count...By之类的前缀,然后解析剩余的名字。我们也可以在方法名中加入更多的表达式,比如查询时需要distinct约束,那么在方法名中加入Distinct即可。方法名中的第一个By是一个分解符,代表着查询语句的开始,我们可以用And或Or来将多个查询条件关联起来。

Example 6.Query creation from method names(通过方法名创建查询)

public interface PersonRepository extends Repository<User, Long> {

  List<Person> findByEmailAddressAndLastname(EmailAddress emailAddress, String lastname);

  // Enables the distinct flag for the query
  // 在查询中使用distinct约束
  List<Person> findDistinctPeopleByLastnameOrFirstname(String lastname, String firstname);
  List<Person> findPeopleDistinctByLastnameOrFirstname(String lastname, String firstname);

  // Enabling ignoring case for an individual property
  // 忽略大小写 在方法名中加入IgnoreCase
  List<Person> findByLastnameIgnoreCase(String lastname);
  // Enabling ignoring case for all suitable properties
  // 所有属性都忽略大小写 在方法名中加入AllIgnoreCase
  List<Person> findByLastnameAndFirstnameAllIgnoreCase(String lastname, String firstname);

  // Enabling static ORDER BY for a query
  // 排序 在方法名中加入OrderBy
  List<Person> findByLastnameOrderByFirstnameAsc(String lastname);
  List<Person> findByLastnameOrderByFirstnameDesc(String lastname);
}

对方法名的解析结果取决于实际要操作的数据库/搜索引擎是什么。另外,还有一些普遍的问题要注意:

  • 在方法名中,可以使用AndOr连接多个属性。除此之外还可以使用Between,LessThan,GreaterThan,Like等等,不同数据库支持的连接符是不一样的,需要查看相关文档
  • 可以使用IgnoreCase来忽略单个属性的大小写,比如findByLastnameIgoreCase,也可以使用AllIgnoreCase来忽略全部属性的大小写。前提是,实际选择的数据库/搜索引擎支持。
  • 可以使用OrderBy来对相关属性进行排序。具体是升序还是降序,是通过AscDesc控制的。如果想了解动态排序,请看处理特殊参数