数据查询
count数量查询
huiche的dao默认提供了多个count查询变种,每个还提供不同参数的重载,固定返回long的结果,如果需要查询多行结果,请使用list等方法
count查询数量(底层执行count(*)),统计满足条件的所有行的数量,包括NULLcountColumn查询指定列数量,忽略该列为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查询
传入泛型类型示例
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系列方法是get和getColumn系列方法的变种,返回了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方法底层先后调用count和list方法查询结果,如果count结果为0 不会执行list查询
page通过条件查询,resultType为实体类型pageAs通过条件查询, 返回为传入的resultType的类型
说明
page系列方法需传入一个Pageable接口的参数,实际调用该接口的limit()和offset()方法- huiche默认提供了
PageReq类作为Pageable的默认实现(Pageable.of()默认返回PageReq), 他是一个从base-1实现,即首页为1而不是0,如果你需要base-0,那需要自行实现Pageable - 另外建议接口设计时,分别提供
count和list接口,来替代page接口,这样可以由前端控制调用,比如进入页面时,只需要调用1次count,翻页时无需调用count, - 众所周知,数据量较大时,
count查询是耗时的,这样可以减少count查询的次数,确实有可能存在count与list不匹配问题, 但是一般属于可容忍的.而且即便是调用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参数的重载, 可以利用其来进行一些,指定查询列, 关联查询,分组查询等,点击下一页继续了解