[英]How do I do “SELECT something IN (…)” with jooq?
我正在嘗試用Jooq做以下事情,並且不能為我的生活弄清楚如何正確地做到這一點:
select name, id in (
select capability_id
from a.capabilities_users
where user_id = ?)
from a.capabilities;
基本上我想獲得所有項目(功能)並知道每個項目是否適用於特定用戶。 似乎所有條件類型操作符(如大於或在中)只能在where而不是select中使用。 我想不出怎么表達這個。
最糟糕的情況是,我可以做一個選擇計數,然后在Java中做布爾邏輯,但我希望使用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)
存在unqiue約束。 然后這將轉化為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
語句。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.