Skip to content

数据查询

count数量查询

huiche的dao默认提供了多个count查询变种,每个还提供不同参数的重载,固定返回long的结果,如果需要查询多行结果,请使用list等方法

  • count 查询数量(底层执行count(*)),统计满足条件的所有行的数量,包括NULL
  • countColumn 查询指定列数量,忽略该列为NULL的值
  • countColumnDistinct 查询指定列数量,忽略该列为NULL的值,忽略重复的值

说明

count系列查询,提供Consumer<Select> customizer参数来完全自定义查询语句,但建议只增加关联和条件,并且存在如下限制

  • orderby无效,会被忽略
  • select无效,selections会被重新设置为当前调用方法内置的countSelection(COUNT(*)COUNT(col)COUNT(DISTINCT col))
  • limit/offset无效,会被忽略

以上限制仅当前Select语句本级,不影响条件中的子查询等

exists存在查询

huiche的dao默认提供了多个exists查询变种,每个还提供不同参数的重载,固定返回boolean的结果,如果需要查询多行结果,请使用list等方法

  • exists 查询传入条件下的数据是否存在
  • existsById 查询指定ID的数据是否存在

getColumn查询指定列

huiche的dao默认提供了多个getColumn查询变种,每个还提供不同参数的重载,查询SELECT column,固定返回columnType的结果

  • getColumn 通过条件查询
  • getColumnById 通过ID查询

传入泛型类型示例

java
public void helloworld() {
    List<String> result = dao.getColumn(Artist.Fields.name,
        new TypeRef<List<String>>(){},select->select.where(XXX));
}

说明

  • getColumn底层通过ps.setMaxRows(1)只获取一条数据,需自行确保当前条件下只返回1条或0条数据,否则会获取第1条
  • 支持类型携带泛型,返回类似List<String>Map<String,Object>的结果(需要当前列数据序列化存储,如json,且启用了序列化Mapper,starter默认配置使用jackson)

get单条记录查询

huiche的dao默认提供了多个get查询变种,每个还提供不同参数的重载,查询SELECT table.*,固定返回resultType的结果

  • get 通过条件查询,resultType为实体类型
  • getById 通过ID查询,resultType为实体类型
  • getAs 通过条件查询, 返回为传入的resultType的类型
  • getByIdAs 通过ID查询, 返回为传入的resultType的类型

    get底层通过ps.setMaxRows(1)只获取一条数据,需自行确保当前条件下只返回1条或0条数据,否则会获取第1条

listColumn列表查询指定列

huiche的dao默认提供了多个listColumn查询变种,每个还提供不同参数的重载,查询SELECT column,固定返回List<columnType>的结果

  • listColumn 通过条件查询
  • listColumnByIds 通过ID查询

list列表查询

huiche的dao默认提供了多个list查询变种,每个还提供不同参数的重载,查询SELECT table.*,固定返回List<resultType>的结果

  • list 通过条件查询,resultType为实体类型
  • listByIds 通过ID查询,resultType为实体类型
  • listAs 通过条件查询, 返回为传入的resultType的类型
  • listByIdsAs 通过ID查询, 返回为传入的resultType的类型

optional单条记录查询

huiche的dao默认提供了多个optional查询变种,每个还提供不同参数的重载,固定返回Optional<resultType>的结果

本质上optional系列方法是getgetColumn系列方法的变种,返回了Optional包装的结果

  • optional 通过条件查询,resultType为实体类型
  • optionalById 通过ID查询,resultType为实体类型
  • optionalAs 通过条件查询, 返回为传入的resultType的类型
  • optionalByIdAs 通过ID查询, 返回为传入的resultType的类型
  • optionalColumn 通过条件查询单列, resultType为传入的columnType类型
  • optionalColumnById 通过ID查询单列, resultType为传入的columnType类型

optional底层通过ps.setMaxRows(1)只获取一条数据,需自行确保当前条件下只返回1条或0条数据,否则会获取第1条

page分页查询

huiche的dao默认提供了多个page查询变种,每个还提供不同参数的重载,查询SELECT table.*,固定返回Page<resultType>的结果

page方法底层先后调用countlist方法查询结果,如果count结果为0 不会执行list查询

  • page 通过条件查询,resultType为实体类型
  • pageAs 通过条件查询, 返回为传入的resultType的类型

说明

  • page系列方法需传入一个Pageable接口的参数,实际调用该接口的limit()offset()方法
  • huiche默认提供了PageReq类作为Pageable的默认实现(Pageable.of()默认返回PageReq), 他是一个从base-1实现,即首页为1而不是0,如果你需要base-0,那需要自行实现Pageable
  • 另外建议接口设计时,分别提供countlist接口,来替代page接口,这样可以由前端控制调用,比如进入页面时,只需要调用1次count,翻页时无需调用count,
  • 众所周知,数据量较大时,count查询是耗时的,这样可以减少count查询的次数,确实有可能存在countlist不匹配问题, 但是一般属于可容忍的.而且即便是调用page 同样存在这个问题的, 除非添加事务. 这样也方便list使用游标条件查询,而不是offset,进一步提高性能

stream查询

huiche的dao默认提供了多个stream查询变种,每个还提供不同参数的重载,查询SELECT table.*,固定返回Stream<resultType>的结果 如果需要对结果进行stream相关操作,可以避免从list再转换stream

  • stream 通过条件查询,resultType为实体类型
  • streamAs 通过条件查询, 返回为传入的resultType的类型

如果查询结果类中包含流类型,Reader,InputStream 等, 必须使用stream查询,且在stream操作中读取完,后续不可读取


查询方法提供一个带有Consumer<Select> customizer参数的重载, 可以利用其来进行一些,指定查询列, 关联查询,分组查询等,点击下一页继续了解