QueryByExampleExecutor的使用
QBE是一种查询技术,允许动态创建查询,并且不需要编写包含字段名称的查询
public interface QueryByExampleExecutor<T> { // 根据实例查找一个对象 <S extends T> Optional<S> findOne(Example<S> var1); // 根据实例查找一批对象 <S extends T> Iterable<S> findAll(Example<S> var1); // 根据实例查找一批对象,且排序 <S extends T> Iterable<S> findAll(Example<S> var1, Sort var2); // 根据实例查找一批对象,且排序和分页 <S extends T> Page<S> findAll(Example<S> var1, Pageable var2); // 根据实例查找,返回符合条件的对象个数 <S extends T> long count(Example<S> var1); // 根据实例查找,返回符合条件的对象 <S extends T> boolean exists(Example<S> var1); }
Example包含三部分内容:
- Probe: 查询条件的封装类
- ExampleMatcher: 有关于如何匹配特定字段的匹配规则,它可以重复使用在多个示例,必填
- Example: 用于创建查询
使用示例:
@Test public void testQBE() { SystemUser systemUser = new SystemUser(); systemUser.setUname("li"); ExampleMatcher matcher = ExampleMatcher.matching() .withMatcher("uname", ExampleMatcher.GenericPropertyMatchers.startsWith()); Example<SystemUser> example = Example.of(systemUser, matcher); List<SystemUser> systemUserList = this.userRepository.findAll(example); System.out.println(systemUserList); }
QueryByExampleExecutor的特点及约束
支持动态查询,输入字段为null则忽略这个条件
不支持过滤条件分组,如 uname = ?0 or (email = ?1 and email = ?2)
支持字符串的开始、包含、结束、正则匹配和其他属性类型的精确匹配
ExampleMatcher详解
nullHandler:null值处理方式,枚举类型
- INCLUDE(包括)
- IGNORE(忽略)
标识作为条件的实体对象中,一个属性值为null 时,标识是否参与过滤
defaultStringMatcher: 默认字符串匹配方式,枚举类型,有6个可选值:
- DEFAULT(默认,效果同EXACT) :
- EXACT(相等): uname=?1
- STARTING(开始匹配): LOWER(uname) = LOWER(?1)
- ENDING(结束匹配): LOWER(uname) like = LOWER(?1)+'%'
- CONTAINING(包含,模糊匹配): uname like '%' + ?1
- REGEX(正则表达式) : uname like '%' + ?1 + '%'
对所有字符串属性有效,除非该属性在propertySpecifiers中单独定义匹配方式
defaultIgnoreCase: 默认大小写忽略方式,boolean,false不忽略大小写,propertySpecifiers中可单独定义
propertySpecifiers: 各属性自定义查询方式包含:属性名、字符串匹配方式、大小写忽略方式、属性转换器
ignorePaths: 忽略属性列表,忽略的属性不参与查询
QueryByExampleExecutor使用场景
使用一组静态或动态约束来查询数据存、频繁重构域对象,而不用担心破坏现有查询、简单的查询的使用场景
实际中需要考虑的因素:
查询条件表示有两部分: 一是条件值,二是查询方式,条件值使用实体对象存储,页面传入值按值进行过滤,未传入值则忽略
需要考虑的因素如下:
1、null值的处理,是否需要匹配数据库中字段值为 null 的记录
2、基本类型的处理,比如 int 的默认值是0 ,为了避免不传值时,使用默认值进行查询,避免使用基本类型,采用包装类型
3、忽略某些属性值,实体类中的所有属性是否都需要参与查询
4、不同的过滤方式,查询条件判断不一样
5、大小写匹配

浙公网安备 33010602011771号