public interface QueryHelper
// select a.id as `a.id` ,b.name as b.name from table_a a
// left join table_b b on a.id=b.id
// where b.name like 'zhang%'
Flux<R> = helper
.select(R.class)
.as(A::getName,R::setName)
.as(A::getId,R::setAid)
.from(A.class)
.leftJoin(B.class,spec-> spec.is(A::id, B::id))
.where(dsl->dsl.like(B::getName,'zhang%'))
.fetch();
使用原生SQL方式来构建动态条件查询
helper
.select("select * from table_a a left join table_b b on a.id=b.id",R::new)
.where(dsl->dsl.like(R::getName,'zhang%'))
.fetch();
| 限定符和类型 | 接口和说明 |
|---|---|
static interface |
QueryHelper.ColumnMapperSpec<R,Self extends QueryHelper.ColumnMapperSpec<R,Self>>
列名映射构造器
|
static interface |
QueryHelper.ExecuteSpec<R>
执行查询
|
static interface |
QueryHelper.FromSpec<R> |
static interface |
QueryHelper.Getter<S,V>
Getter接口定义,只能使用方法引用实现此接口,如:
MyEntity::getId
|
static interface |
QueryHelper.JoinSpec<R>
表关联构造器
|
static interface |
QueryHelper.NativeQuerySpec<T> |
static interface |
QueryHelper.SelectColumnMapperSpec<R> |
static interface |
QueryHelper.SelectSpec<R> |
static interface |
QueryHelper.Setter<S,V>
Setter接口定义,只能使用方法引用实现此接口,如:
MyEntity::setId
|
static interface |
QueryHelper.SortSpec<R>
排序构造器
|
static interface |
QueryHelper.WhereSpec<R>
查询条件构造器
|
| 限定符和类型 | 方法和说明 |
|---|---|
QueryAnalyzer |
analysis(String selectSql)
基于SQL创建分析器
|
static <T,ID,R> reactor.core.publisher.Flux<T> |
combineOneToMany(reactor.core.publisher.Flux<T> source,
QueryHelper.Getter<T,ID> idMapper,
java.util.function.Function<Set<ID>,reactor.core.publisher.Flux<R>> fetcher,
QueryHelper.Getter<R,ID> mainIdGetter,
QueryHelper.Setter<T,List<R>> setter)
一对多数据组合,通常用于进行一对多的数据查询.
|
static <T,ID,R> reactor.core.publisher.Flux<T> |
combineOneToMany(reactor.core.publisher.Flux<T> source,
QueryHelper.Getter<T,ID> idMapper,
org.hswebframework.ezorm.rdb.mapping.ReactiveQuery<R> fetcher,
QueryHelper.Getter<R,ID> mainIdGetter,
QueryHelper.Setter<T,List<R>> setter)
一对多数据组合,通常用于进行一对多的数据查询.
|
<R> QueryHelper.SelectColumnMapperSpec<R> |
select(Class<R> resultType)
创建一个查询构造器
|
<R> QueryHelper.SelectSpec<R> |
select(Class<R> resultType,
java.util.function.Consumer<QueryHelper.ColumnMapperSpec<R,?>> mapperSpec)
创建一个查询构造器,并返回指定的实体类型
|
QueryHelper.NativeQuerySpec<org.hswebframework.ezorm.rdb.mapping.defaults.record.Record> |
select(String sql,
Object... args)
创建原生SQL查询器
预编译参数仅支持
? |
<T> QueryHelper.NativeQuerySpec<T> |
select(String sql,
java.util.function.Supplier<T> newInstance,
Object... args)
逻辑和
select(String, Object...)相同,将查询结果转换为指定的实体类 |
static <S,T> reactor.core.publisher.Mono<PagerResult<T>> |
transformPageResult(reactor.core.publisher.Mono<PagerResult<S>> source,
java.util.function.Function<List<S>,reactor.core.publisher.Mono<List<T>>> transfer)
转换分页结果中的数据为另外一种数据
|
QueryAnalyzer analysis(String selectSql)
selectSql - SQL<T> QueryHelper.NativeQuerySpec<T> select(String sql, java.util.function.Supplier<T> newInstance, Object... args)
select(String, Object...)相同,将查询结果转换为指定的实体类T - 实体类型sql - SQLnewInstance - 实体类实例化方法args - 参数QueryHelper.NativeQuerySpec<org.hswebframework.ezorm.rdb.mapping.defaults.record.Record> select(String sql, Object... args)
预编译参数仅支持?占位符,如果要使用模版,请使用SqlRequests.template(String, Object)
构造sql以及参数
Flux<Record> records = helper
.select("select * from table where type = ?",type)
//注入动态查询条件
.where(param)
//或者编程式构造动态条件
.where(dsl->dsl.is("name",name))
//执行查询
.fetch();
join逻辑:
helper.select("select t1.id,t2.* from table t1"+
" left join table2 t2 on t1.id = t2.id") ...
将返回结构:
[
{
"id":"t1.id的值",
"t2.c1":"t2的字段"
}
]
⚠️注意:避免动态拼接SQL语句,应该使用预编译参数或者动态注入动态条件来进行条件处理.
sql - SQL查询语句args - 预编译参数<R> QueryHelper.SelectColumnMapperSpec<R> select(Class<R> resultType)
R - 类型resultType - 实体类型,必须明确定义实体类,不能使用Map等类型<R> QueryHelper.SelectSpec<R> select(Class<R> resultType, java.util.function.Consumer<QueryHelper.ColumnMapperSpec<R,?>> mapperSpec)
R - 类型resultType - 实体类型,必须明确定义实体类,不能使用Map等类型mapperSpec - 实体映射配置static <T,ID,R> reactor.core.publisher.Flux<T> combineOneToMany(reactor.core.publisher.Flux<T> source,
QueryHelper.Getter<T,ID> idMapper,
org.hswebframework.ezorm.rdb.mapping.ReactiveQuery<R> fetcher,
QueryHelper.Getter<R,ID> mainIdGetter,
QueryHelper.Setter<T,List<R>> setter)
Flux<MyEntity> flux = QueryHelper
.combineOneToMany(
myService.createQuery().fetch(),
MyEntity::getId,
infoService.createQuery(),
InfoEntity::getMyId,
MyEntity::setInfos
)
T - 主数据类型ID - 主数据ID类型R - 关联数据类型source - 源数据idMapper - 主数据的ID获取器,如: MyEntity::getIdfetcher - 关联数据获取器,如: infoService.createQuery()mainIdGetter - 关联数据的主数据ID获取器,如: InfoEntity::getMyIdsetter - 主数据的关联数据设置器,如: MyEntity::setInfosstatic <T,ID,R> reactor.core.publisher.Flux<T> combineOneToMany(reactor.core.publisher.Flux<T> source,
QueryHelper.Getter<T,ID> idMapper,
java.util.function.Function<Set<ID>,reactor.core.publisher.Flux<R>> fetcher,
QueryHelper.Getter<R,ID> mainIdGetter,
QueryHelper.Setter<T,List<R>> setter)
T - 主数据类型ID - 主数据ID类型R - 关联数据类型source - 源数据idMapper - 主数据的ID获取器,如: MyEntity::getIdfetcher - 关联数据获取器,如: ids->infoService.createQuery().in(InfoEntity::getMyId,ids).fetch()mainIdGetter - 关联数据的主数据ID获取器,如: InfoEntity::getMyIdsetter - 主数据的关联数据设置器,如: MyEntity::setInfosstatic <S,T> reactor.core.publisher.Mono<PagerResult<T>> transformPageResult(reactor.core.publisher.Mono<PagerResult<S>> source, java.util.function.Function<List<S>,reactor.core.publisher.Mono<List<T>>> transfer)
S - T - source - 原始分页数据transfer - 转换器Copyright © 2016–2023. All rights reserved.