gpt4 book ai didi

java - 我如何用 jooq 做 "SELECT something IN (...)"?

转载 作者:搜寻专家 更新时间:2023-11-01 02:47:30 25 4
gpt4 key购买 nike

我正在尝试使用 Jooq 执行以下操作,但我终究无法弄清楚如何正确地执行此操作:

select name, id in (
select capability_id
from a.capabilities_users
where user_id = ?)
from a.capabilities;

基本上我想获取所有项目(功能)并知道每个项目是否适用于特定用户。似乎所有条件类型运算符(如大于或 in)都只能在 where 而不是 select 中使用。我想不出还有什么方式可以表达这一点。

最坏的情况,我可以做一个选择计数,然后用 Java 做 boolean 逻辑,但我希望使用 fetchMap。

最佳答案

根据您的数据库和模式元数据,LEFT JOIN 可能是比投影中的谓词更好的选择。您当然应该在执行计划中验证这一点。

LEFT JOIN 解决这个问题:

-- NVL2 is Oracle syntax. 
-- jOOQ will emulate NVL2 using CASE, if it's not available in your database
SELECT c.name, NVL2(cu.capability_id, 1, 0)
FROM a.capabilities c
LEFT OUTER JOIN a.capabilities_users cu
ON (c.id = cu.capability_id
AND cu.user_id = ?)

当然,上面假设 cu(user_id, capability_id) 有一个唯一的约束。然后这将转化为 jOOQ:

Capabilities c = CAPABILITIES.as("c");
CapabilitiesUsers cu = CAPABILITIES_USERS.as("cu");

Field<String> key = c.NAME.as("key");
Field<Boolean> value = nvl2(
CAPABILITIES_USER.CAPABILITY_ID, true, false
).as("value");

Map<String, Boolean> map =
DSL.using(configuration)
.select(key, value)
.from(c)
.leftOuterJoin(cu)
.on(c.ID.eq(cu.CAPABILITY_ID))
.and(cu.USER_ID.eq(...))
.fetchMap(key, value);

用投影中的谓词解决这个问题:

如果您真的更喜欢投影中的谓词,您可以尝试 DSL.field(Condition) ,这恰好允许:

Field<String> key = CAPABILITIES.NAME.as("key");
Field<Boolean> value = field(
CAPABILITIES.ID.in(
select(CAPABILITY_ID)
.from(CAPABILITIES_USERS)
.where(CAPABILITIES_USERS.USER_ID.eq(...))
)
).as("value");

Map<String, Boolean> map =
DSL.using(configuration)
.select(key, value)
.from(CAPABILITIES)
.fetchMap(key, value);

请注意,如果您使用的是符合标准的数据库,它不允许将谓词视为列,DSL.field(Condition)将为您呈现等效的 CASE 语句。

关于java - 我如何用 jooq 做 "SELECT something IN (...)"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18794759/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com