java – 如何使用jooq“选择IN(…)”?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 如何使用jooq“选择IN(…)”?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1784字,纯文字阅读大概需要3分钟。
内容图文
![java – 如何使用jooq“选择IN(…)”?](/upload/InfoBanner/zyjiaocheng/793/33c743b425e34228a9d69324dc282f1c.jpg)
我正在尝试用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语句.
内容总结
以上是互联网集市为您收集整理的java – 如何使用jooq“选择IN(…)”?全部内容,希望文章能够帮你解决java – 如何使用jooq“选择IN(…)”?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。