JOOQ查询如何判断指定字段的所有关联行另一字段值一致并返回布尔值
方案说明
你原来的写法本身已经满足性能要求:fetchExists 底层会自动给查询加LIMIT 1,只要查到第一条匹配的记录就会立刻终止查询返回结果,不会触发全表扫描。
如果要追求更高的可读性、让代码更贴合业务语义,推荐使用JOOQ提供的every聚合函数实现:
// 若未静态导入org.jooq.impl.DSL的方法,补全DSL.前缀即可 return context.fetchValue( select(every(TABLE_NAME.STATUS.eq("Single"))) .from(TABLE_NAME) .where(TABLE_NAME.NAME.eq("Erick")) );
优势说明
- 语义完全贴合需求:
every函数本身的含义就是「所有符合条件的行都满足括号内的判断时返回true,否则返回false」,不需要像原来的写法那样多一层取反逻辑,代码看一眼就能知道业务含义 - 性能和原有写法一致:绝大多数支持
EVERY(部分数据库别名是BOOL_AND)的关系型数据库都会对这类聚合做短路径优化,遇到第一个不满足条件的行就会直接返回false,不会扫描全表
如果需要兼容不支持EVERY聚合的老旧数据库,你可以把原有写法调整格式进一步提升可读性:
// 不存在Name为Erick且Status不等于Single的记录,即所有Erick的Status都是Single return !context.fetchExists( context.selectFrom(TABLE_NAME) .where(TABLE_NAME.NAME.eq("Erick")) .and(TABLE_NAME.STATUS.ne("Single")) );
内容的提问来源于stack exchange,提问作者EDR
相关产品推荐
相关产品推荐

