【问题标题】:jOOQ dynamic SQL questionsjOOQ 动态 SQL 题
【发布时间】:2017-07-03 16:12:29
【问题描述】:

问题一:

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如何实现?

根据表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;

【问题讨论】:

  • 欢迎来到 Stack Overflow。我将在一个答案中回答您的两个问题,但在未来,理想情况下,最好每个问题只问一个问题。
  • 好的,我记住了。

标签: mysql sql jooq


【解决方案1】:

答案 1:

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

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

在您的情况下,我假设您已使用 jOOQ code generator 生成 SYS_MENU 表:

// 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();

【讨论】:

  • 答案1:在jooq中“limit(offset,limit)”相当于mybatis“limit #{offset},#{limit } " ?
  • @ChunfyTseng:不,我忽略了那部分,抱歉。用可能的替代方法更新了答案。
猜你喜欢
  • 2017-08-12
  • 2023-03-22
  • 2020-10-05
  • 2023-01-14
  • 1970-01-01
  • 2012-12-12
  • 2020-10-07
  • 2021-09-26
  • 2018-04-09
相关资源
最近更新 更多