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 expression (QueryPart
),可以分配给局部变量并用于编写复杂的动态 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();
问题 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 expression (QueryPart
),可以分配给局部变量并用于编写复杂的动态 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();