簡體   English   中英

如何用jooq“選擇一些東西(...)”?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM