跳至主要內容

简介

xuejmnet大约 6 分钟

查询

easy-query在java的静态语言特性下,参考众多C# ORM(efcore,freesql,sqlsugar...),和java ORM(mybatis-plus,beetlsql...)实现了支持单表多表,复杂,嵌套的sql表达式,并且拥有强类型语法提示,可以帮助不想写sql的用户,有洁癖的用户多一个选择.

select

eqselect是用来终结当前表达式生成新的表达式的方式,简单理解为表示告诉框架当前表达式需要返回的结果是select的结果,如果您了解stream api那么可以简单的理解为其map操作

概念补充 说明!!!

eq这个orm与之前您认识的java其他orm不相同,这个orm实现了近乎95%的sql功能,其中一个就是子查询嵌套,所谓的子查询嵌套就是将之前查询结果视作派生表或叫做内嵌视图,后续我们将其统一称其为内嵌视图,比如select .... from (select id,name from table where name like ?) t where t.id = ?这个sql的括号内的那一部分(select id,name from table where name like ?)我们称之为内嵌视图

所以我们可以很轻易的实现其他orm无法实现的

select ... from
    (
        select
            key1,
            key2,
            count() as c,
            avg() as a,
            sum() as s
        from
            table
        where
            name like ?
        group by
            key1,
            key2
    ) t1
    left join table2 t2 on t.key1 = t2.key1
where.....

select后置风格

和原生SQL不同,在eq提供的DSL中,使用的是select后置风格,这个风格多见于c#语言的orm中和stream api有一种异曲同工之处,那么为什么eq选择select后置?

  • 强类型的java语言类型select后置有助于推导表达式后续可操作的类,比如stream api
  • select后置其实本质和书写sql是一样的,虽然你在编写sql的时候是select先写但是你在不写from group by等操作后是无法编写select的内容只能用*来代替,所以其实sql的书写本质也是select后置

说明!!!

这张图充分的说明了sql的执行过程和解析过程也是eq的书写过程,该执行流程中唯一能调换的就是selectorder by的顺序

  • 每次select会对之前的表达式进行汇总生成内嵌视图,对后续的select继续操作那么将对内嵌视图进行操作

select语句出现在whereorderBygroupByhaving等之后,如果表达式调用了select那么这个sql就是确定了的如果再次调用where那么前面的表达式将被视为派生表内嵌视图,比如select .... from (select id,name from table ) t where t.id = ?每次select会对当前表达式进行一次结果集包装(派生表内嵌视图)

API

方法支持后续链式描述
select proxy用户可以自定义实现返回结果
(返回结果必须是Proxy类, 简单说就是DTO需要添加注解@EntityProxy)
selectColumn用于用户返回单个字段, 当然也可以直接用select(o->o.id())需要eq 2.0.0^
select(Class<TR>)自动映射表和DTO对应关系, (对应关系是DTO映射的columnName和实体的columnName一致则映射), 比如两个属性都是name, 但是实体添加了@Column(value="my_name")那么DTO的name属性如果没有添加对应的注解, 将无法自动映射需要手动as来进行查询
select(Class<TR>,expression)用户可以对任意DTO对象的class进行自动或者手动映射比如
select(DTO.class,o->Select.of(o.FETCHER.allFields(),o.name().as("myName")))
selectAutoInclude支持用户返回任意列的数据库对象关系关联的数据, 比如嵌套结构:
{name:.. , age:... ,list:[{...}, {...}]}
selectAutoInclude expression支持用户返回任意列的数据库对象关系关联的数据,
并且还可以额外自定义join返回其他数据, 比如嵌套结构:
{name:.. , age:... ,list:[{...}, {...}]}

API

方法参数返回描述
streamByFunction<Stream<T>,TR> fetcher任意stream的终结方法使用java方式只需要迭代一次返回符合stream的结果
toSqlstring返回当前表达式即将执行的sql语句
anyboolean返回当前表达式是在数据库中是否存在匹配项,存在至少一条返回true,无法匹配任意一条在返回false
requiredvoid返回当前表达式是在数据库中是否存在匹配项,存在至少一条,无法匹配任意一条抛错
alllambdaboolean返回当前表达式是在数据库中是否所有的都匹配,参数为符合条件的表达式
countlong返回当前表达式在数据库中命中的条数有多少,没有匹配数返回0
firstOrNullTEntity返回当前表达式在数据库中命中的第一条,如果没命中就返回null
toListList<TEntity>返回当前表达式在数据库中命中的所有结果,如果没有结果则返回空集合
wherelambdathis对当前表达式进行条件追加
limit1.offset,2.rowsthis对当前表达式进行查询结果返回和偏移进行限制,offset表示跳过多少条,limit表示获取多少条
orderBylambdathis对当前表达式进行查询结果进行排序
sumBigDecimalOrDefaultlambda,默认值BigDecimal用于对lambda列进行求和,返回结果BigDecimal防止结果溢出
sumOrDefaultlambda,默认值列类型用于对lambda列进行求和
maxOrDefaultlambda,默认值列类型用于对lambda列进行最大值查询
minOrDefaultlambda,默认值列类型用于对lambda列进行最小值查询
avgOrDefaultlambda,默认值列类型用于对lambda列进行平均值值查询
lenOrDefaultlambda,默认值列类型用于对lambda列进行长度查询
whereByIdobject 主键this添加单主键条件
whereObjectobject 查询对象this添加对象查询条件
groupBylambdathis查询分组
havinglambdathis查询对分组结果进行筛选
orderByDynamicEasyDynamicOrderByConfigurationthis添加查询动态排序
distinctthis对查询结果进行去重
toPageResultlong,longPageResult对结果进行先count,然后limit+toList查询结果并且封装成PageResult返回
toShardingPageResultlong,long,sequenceCountLinePageResult支持高性能分片下的分页查询,如果第三个参数为null那么和toPageResult行为一致
leftJoinlambdathis左链接
rightJoinlambdathis右链接
innerJoinlambdathis内链接
disableLogicDeletethis本次查询不启用逻辑删除
enableLogicDeletethis本次查询启用逻辑删除
noInterceptorthis本次查询不使用拦截器
noInterceptornamethis不使用指定name的拦截器
useInterceptorthis本次查询使用拦截器
useInterceptornamethis使用指定name的拦截器
asTrackingthis本次查询使用追踪,需要开启追踪后才有效
asNoTrackingthis本次查询不使用追踪,默认就是不使用追踪
asTabletableNamethis指定本次查询最近的表的表名,如果最近的表是匿名表则设置表别名alias
asTablelambdathis指定本次查询最近的表的表名,如果最近的表是匿名表则设置表别名alias,表达式入参为现有表名返回设置的表名
unionqueryablethisunion 查询
unionAllqueryablethisunion all查询
上次编辑于:
贡献者: xuejiaming,Hoysing