这是一款国产的最强java orm,它完美支持可控强类型dsl,外加完美支持对象模型筛选拉取的orm。拥有非常智能的include(s)一对多、一对一、多对多、多对一实现的orm。
如果你想了解更多关于这项技术,可以访问以下地址:
地址github: https://github.com/dromara/easy-query
地址gitee: https://gitee.com/dromara/easy-query
文档地址: http://www.easy-query.com/easy-query-doc/
这款orm拥有高度抽象屏蔽各大数据库方言,让你的换库如鱼得水非常方便。它集成实现各种数据库方言的使用,让你轻松应对各种需求。在对象模型上,让你可以省去大把时间在多对多之间来回筛选。
场景1
在用户和角色、角色和菜单的关系中,用户和角色是多对多,角色和菜单也是多对多。
很多普通orm在演示的时候只会对当前表的属性进行筛选排序等操作,但是如果遇到查询主表筛选条件是子表时,大部分orm会变得非常麻烦。然而,使用easy-query却非常简单,并且还支持动态条件:
- 筛选用户
- 条件是角色包含管理员的
下面是一个示例代码:
List<SysUser> managers = easyEntityQuery.queryable(SysUser.class)
.where(s -> {
s.roles().any(role -> {
role.name().eq("管理员");
});
}).toList();
这个条件支持动态多对多筛选。如果条件为false,生成的sql将会是:
SELECT `id`,`company_id`,`name`,`age`,`create_time` FROM `t_user`
easy-query的智能条件处理令人惊讶,让动态多对多筛选变得非常简单。
接下来我们再来看看下一个场景。
场景2
在用户和角色和菜单的关系中,分别是多对多和多对多。
- 筛选用户
- 条件是用户拥有/admin的菜单
下面是一个示例代码:
List<SysUser> managers = easyEntityQuery.queryable(SysUser.class)
.where(s -> {
s.roles().flatElement().menus().any(menu->{
menu.route().eq("/admin");
});
}).toList();
生成的sql如下:
-- 第1条sql数据
SELECT
t.`id`,
t.`company_id`,
t.`name`,
t.`age`,
t.`create_time`
FROM
`t_user` t
WHERE
EXISTS (
SELECT
1
FROM
`t_role` t1
WHERE
EXISTS (
SELECT
1
FROM
`t_user_role` t2
WHERE
t2.`role_id` = t1.`id`
AND t2.`user_id` = t.`id` LIMIT 1
)
AND EXISTS (
SELECT
1
FROM
`t_menu` t3
WHERE
EXISTS (
SELECT
1
FROM
`t_role_menu` t4
WHERE
t4.`menu_id` = t3.`id`
AND t4.`role_id` = t1.`id` LIMIT 1
)
AND t3.`route` = '/admin' LIMIT 1
) LIMIT 1
)
场景3
- 查询用户
- 条件是用户拥有的角色数量不少于3个的
List<SysUser> managers = easyEntityQuery.queryable(SysUser.class)
.where(s -> {
s.roles().count().ge(3L);
}).toList();
生成的sql如下:
-- 第1条sql数据
SELECT
t.`id`,
t.`company_id`,
t.`name`,
t.`age`,
t.`create_time`
FROM
`t_user` t
WHERE
(
SELECT
COUNT(*)
FROM
`t_role` t1
WHERE
EXISTS (
SELECT
1
FROM
`t_user_role` t2
WHERE
t2.`role_id` = t1.`id`
AND t2.`user_id` = t.`id` LIMIT 1
)
) >= 3
场景4
- 查询角色
- 条件是角色关联的用户平均年龄是15岁或者姓金的至少有2位以上
List<SysRole> roles = easyEntityQuery.queryable(SysRole.class)
.where(role -> {
role.or(()->{
role.users().avg(u->u.age()).ge(BigDecimal.valueOf(15));
role.users().where(u->u.name().likeMatchLeft("金")).count().ge(2L);
});
}).toList();
生成的sql如下:
-- 第1条sql数据
SELECT
t.`id`,
t.`name`,
t.`create_time`
FROM
`t_role` t
WHERE
(
IFNULL((SELECT
AVG(t1.`age`)
FROM
`t_user` t1
WHERE
EXISTS (SELECT
1
FROM
`t_user_role` t2
WHERE
t2.`user_id` = t1.`id`
AND t2.`role_id` = t.`id` LIMIT 1)),0) >= '15'
OR (
SELECT
COUNT(*)
FROM
`t_user` t4
WHERE
EXISTS (
SELECT
1
FROM
`t_user_role` t5
WHERE
t5.`user_id` = t4.`id`
AND t5.`role_id` = t.`id` LIMIT 1
)
AND t4.`name` LIKE '金%'
) >= 2
)
最后
这边展示了非常强大的OLTP查询模式,OLAP也是非常强大可以group+join,实现from (匿名sql) 也可以join (匿名sql)。
一款具有强类型OLTP+OLAP的完美解决方案,它完美支持mybatis系列的任意架构逐步构建迁移,不会产生任何冲突,因为easy-query本身就是零依赖,并且完全免费,完全开源(包括文档!!!包括文档!!!包括文档!!!)。
我相信
easy-query
是一款可以完完全全打动您的ORM作品,也是全java唯一一款全sql替代性产品。
标签:游戏攻略