jOOQ动态SQL问题

时间:2017-06-30 10:25:33

标签: mysql sql jooq

问题1:

mybatis dynamic-sql如下:

python setup.py egg_info failed with error code 1 windows

如何在jooq中实现?

问题2:

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

根据表resource_id,sys_role_resource,sys_user_role

查询用户的权限
<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>

1 个答案:

答案 0 :(得分:0)

答案1:

使用jOOQ,动态SQL非常简单。 jOOQ手册中的整个部分专门用于它: https://www.jooq.org/doc/latest/manual/sql-building/dynamic-sql

基本上,您需要了解在jOOQ对象上调用的每个方法都会生成一种SQL 表达式(a 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();