jOOQ 动态 SQL 个问题

jOOQ dynamic SQL questions

问题 1:

mybatis动态-sql如下:

<select id="queryList" resultType="io.renren.entity.SysMenuEntity">
        select m.*,(select p.name from sys_menu p where p.menu_id = m.parent_id) as parentName 
            from sys_menu m
        <choose>
            <when test="sidx != null and sidx.trim() != ''">
                order by m.${sidx} ${order}
            </when>
            <otherwise>
                order by m.order_num asc
            </otherwise>
        </choose>
        <if test="offset != null and limit != null">
            limit #{offset}, #{limit}
        </if>
    </select>

如何在jooq中实现?

问题 2:

我在jooq中有如下SQL如何实现?

根据table查询用户权限 resource_id,sys_role_resource,sys_user_role

SELECT 
    t4.resource_id,
    t4.name,
    t4.parent_id,
    t4.perms,
    t4.url,
    (SELECT 
            t3.name
        FROM
            sys_resource t3
        WHERE
            t3.resource_id = t4.parent_id) AS parentName
FROM
    sys_resource t4
WHERE
    EXISTS( SELECT 
            t2.resource_id
        FROM
            sys_role_resource t2
        WHERE
            EXISTS( SELECT 
                    t1.role_id
                FROM
                    sys_user_role t1
                WHERE
                    t1.user_id = 1))
ORDER BY t4.order_num ASC;

答案 1:

动态 SQL 使用 jOOQ 非常容易。 jOOQ 手册中有一整节专门介绍它: https://www.jooq.org/doc/latest/manual/sql-building/dynamic-sql

本质上,你需要明白你在 jOOQ 对象上调用的每个方法都会产生一种 SQL expressionQueryPart),可以分配给局部变量并用于编写复杂的动态 SQL 语句。或者,您不将这些表达式分配给局部变量并直接内联它们。由你决定。

在你的情况下,我假设你已经使用 jOOQ code generator 生成 SYS_MENU table:

// Assuming these imports:
import static org.jooq.impl.DSL.*;
import static com.example.generated.Tables.*;

// And then...
SysMenu m = SYS_MENU.as("m");
SysMenu p = SYS_MENU.as("p");

DSL.using(configuration)
   .select(m.fields())
   .select(field(select(p.NAME).from(p).where(p.MENU_ID.eq(m.PARENT_ID))).as("parentName"))
   .from(m)
   .orderBy(
        sidx != null && sidx.trim() != ""
      ? m.field(sidx).sort("desc".equals(order) ? SortOrder.DESC : SortOrder.ASC)
      : m.ORDER_NUM.asc())
   .limit(offset != null ? offset : 0, limit != null ? limit : Integer.MAX_VALUE)
   .fetch();

答案 2:

此查询将 1:1 翻译成 jOOQ

SysUserRole t1 = SysUserRole.as("t1");
SysRoleResource t2 = SysRoleResource.as("t2");
SysResource t3 = SysResource.as("t3");
SysResource t4 = SysResource.as("t4");

DSL.using(configuration)
   .select(
        t4.RESOURCE_ID
        t4.NAME,
        t4.PARENT_ID,
        t4.PERMS,
        t4.URL,
        field(
            select(t3.NAME)
           .from(t3)
           .where(t3.RESOURCE_ID.eq(t4.PARENT_ID))
        )).as("parentName"))
   .from(t4)
   .whereExists(
        select(t2.RESOURCE_ID)
       .from(t2)
       .whereExists(
            select(t1.ROLE_ID)
           .from(t1)
           .where(t1.USER_ID.eq(1))
       )
   )
   .orderBy(t4.ORDER_NUM.asc())
   .fetch();