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、大小写匹配

 

posted @ 2020-11-21 13:58  半雨微凉  阅读(1695)  评论(0)    收藏  举报