|
java最强orm没有之一(支持kotlin) 一款高性能、轻量级、多功能的Java/Kotlin对象查询ORM框架支持分库分表读写分离一款无任何依赖的JAVA/Kotlin ORM 框架,十分轻量,拥有非常高的性能,支持单表查询、多表查询、union、子查询、分页、动态表名、VO对象查询返回、逻辑删、全局拦截、数据库列加密( 支持高性能like查询)、数据追踪差异更新、乐观锁、多租户、自动分库、自动分表、读写分离,支持框架全功能外部扩展定制,拥有强类型表达式。
五大隐式
- 隐式join OneToOne、ManyToOne 自动实现join查询筛选、排序和结果获取
- 隐式子查询 OneToMany、ManyToMany 自动实现子查询查询筛选、排序和聚合函数结果获取
- 隐式分组 OneToMany、ManyToMany 自动实现子查询优化合并将多个子查询合并成一个分组查询支持筛选、排序和聚合函数结果获取
- 隐式分区分组 OneToMany、ManyToMany 自动实现第一个、第N个数据的筛选、排序和聚合函数结果获取
- 隐式CASE WHEN表达式 属性.聚合函数.筛选,o.age().sum().filter(()->o.name().like("123"))
隐式join查询用户条件是用户所属企业是xx公司
- List<SysUser> userInXXCompany = entityQuery.queryable(SysUser.class)
- .where(user -> {
- user.company().name().like("xx公司");
- })
- .orderBy(user -> {
- user.company().registerMoney().desc();
- user.birthday().asc();
- }).toList();
复制代码 隐式子查询查询企业条件是企业必须有小明这个用户并且小明这个用户是2000年1月1日之后出生
- List<Company> companies = entityQuery.queryable(Company.class)
- .where(company -> {
- company.users().any(u -> u.name().like("小明"));
- company.users().where(u -> u.name().like("小明")).max(u -> u.birthday()).gt(LocalDateTime.of(2000,1,1,0,0,0));
- }).toList();
复制代码 隐式分组查询企业条件是企业必须有小明这个用户并且小明这个用户是2000年1月1日之后出生 合并两个子查询使用join group合并
- List<Company> companies = entityQuery.queryable(Company.class)
- //在where中的两个子查询会进行合并
- .subQueryToGroupJoin(company -> company.users())
- .where(company -> {
- company.users().any(u -> u.name().like("小明"));
- company.users().where(u -> u.name().like("小明")).max(u -> u.birthday()).gt(LocalDateTime.of(2000,1,1,0,0,0));
- }).toList();
复制代码 隐式分区分组查询企业要求企业的所有员工年龄最小的那个是小明并且生日是2000年1月1日之前
- List<Company> companies = entityQuery.queryable(Company.class)
- .where(company -> {
- company.users().orderBy(u->u.birthday().desc()).first().name().eq("小明");
- company.users().orderBy(u->u.birthday().desc()).element(0).birthday().lt(LocalDateTime.of(2000,1,1,0,0,0));
- }).toList();
复制代码
隐式CASE WHEN表达式
- List<Draft2<LocalDateTime, Long>> customVO = entityQuery.queryable(SysUser.class)
- .where(user -> {
- user.birthday().lt(LocalDateTime.now());
- }).groupBy(user -> GroupKeys.of(user.companyId()))
- .select(group -> Select.DRAFT.of(
- group.groupTable().birthday().max().filter(() -> {
- group.groupTable().name().like("小明");
- }),
- group.groupTable().id().count().filter(() -> {
- group.groupTable().birthday().ge(LocalDateTime.of(2024, 1, 1, 0, 0));
- })
- )).toList();
- List<Draft3<Long, Long, BigDecimal>> result = entityQuery.queryable(SysUser.class)
- .where(user -> {
- user.birthday().lt(LocalDateTime.now());
- })
- .select(user -> Select.DRAFT.of(
- user.id().count().filter(() -> {
- user.address().eq("Hangzhou");
- }),
- user.id().count().filter(() -> {
- user.address().eq("Beijing");
- }),
- user.age().avg().filter(() -> {
- user.address().eq("Beijing");
- })
- )).toList();
复制代码 单表完整案例首先我们来看一下完整版本的单表查询,涉及到筛选、聚合、聚合筛选、映射查询、排序
- List<Draft3<String, Integer, LocalDateTime>> myBlog = easyEntityQuery.queryable(BlogEntity.class)
- .where(b -> {
- b.content().like("my blog");
- })
- .groupBy(b -> GroupKeys.of(b.title()))
- .having(group -> {
- group.groupTable().star().sum().lt(10);
- })
- //select那么会将select和之前的表达式作为一个内嵌视图(t1表)进行包裹如果后续没有链式配置则会展开否则以内嵌视图(t1表)表示
- .select(group -> Select.DRAFT.of(
- group.key1(),//value1
- group.groupTable().star().sum().asAnyType(Integer.class),//value2
- group.groupTable().createTime().max()//value3
- ))
- //如果不添加orderBy则不会生成内嵌视图(t1表)sql
- //因为orderBy是对前面的select结果进行orderBy
- .orderBy(group -> group.value3().desc())
- limit(2,2)//对结果进行限制返回
- .toList();
- -- 第1条sql数据
- SELECT
- t1.`value1` AS `value1`,
- t1.`value2` AS `value2`,
- t1.`value3` AS `value3`
- FROM
- (SELECT
- t.`title` AS `value1`,
- SUM(t.`star`) AS `value2`,
- MAX(t.`create_time`) AS `value3`
- FROM
- `t_blog` t
- WHERE
- t.`deleted` = false
- AND t.`content` LIKE '%my blog%'
- GROUP BY
- t.`title`
- HAVING
- SUM(t.`star`) < 10) t1
- ORDER BY
- t1.`value3` DESC LIMIT 2,2
复制代码提取码下载:
|
|