Jooq中如何对多字段列表使用DSL.coalesce?
错误原因
你遇到的报错本质是用法方向错误:
coalesce是SQL标准标量函数,仅支持对单个字段做非空判断,不能作用于整行多字段的结果集asField()方法仅支持返回单个列的子查询转为jOOQ的Field对象,多列查询调用该方法本身不符合API设计
正确实现方案
方案1:单查询优先级排序(同表场景性能最优)
仅需要一次数据库查询,通过优先级排序保证优先返回id匹配的行,无匹配时返回handle匹配的行:
MyClass result = dslContext.selectFrom(Tables.MY_TABLE) .where(Tables.MY_TABLE.ID.eq(id) .or(Tables.MY_TABLE.HANDLE.eq(handle))) // 给id匹配的行设置更高优先级 .orderBy(DSL.when(Tables.MY_TABLE.ID.eq(id), 1).otherwise(2)) .limit(1) .fetchOneInto(MyClass.class);
如果两个条件都没有匹配结果,result会返回null,符合预期逻辑。
方案2:分两次查询(逻辑最直白)
适合id查询命中率较高的场景,id命中时不需要执行handle的查询,代码可读性更高:
// 优先按id查询 MyClass result = dslContext.selectFrom(Tables.MY_TABLE) .where(Tables.MY_TABLE.ID.eq(id)) .fetchOneInto(MyClass.class); // id无匹配时再按handle查询 if (result == null) { result = dslContext.selectFrom(Tables.MY_TABLE) .where(Tables.MY_TABLE.HANDLE.eq(handle)) .fetchOneInto(MyClass.class); }
内容的提问来源于stack exchange,提问作者Snookums
相关产品推荐
相关产品推荐

