创建查询
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);
}
对方法名的解析结果取决于实际要操作的数据库/搜索引擎是什么。另外,还有一些普遍的问题要注意:
- 在方法名中,可以使用And和Or连接多个属性。除此之外还可以使用Between,LessThan,GreaterThan,Like等等,不同数据库支持的连接符是不一样的,需要查看相关文档
- 可以使用IgnoreCase来忽略单个属性的大小写,比如findByLastnameIgoreCase,也可以使用AllIgnoreCase来忽略全部属性的大小写。前提是,实际选择的数据库/搜索引擎支持。
- 可以使用OrderBy来对相关属性进行排序。具体是升序还是降序,是通过Asc和Desc控制的。如果想了解动态排序,请看处理特殊参数。