jpa+querydsl的平替国产easy-query最好用的orm

这是一款国产的最强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替代性产品。

标签:游戏攻略