JOOQ中实现空值条件映射至对象的可行性及语法报错问题求助
JOOQ中实现空值条件映射至对象的可行性及语法报错问题求助
当然可以实现这种空值条件下映射对象的需求啦!不过你的代码里有几个小细节没处理好,导致了SQL语法错误,我帮你捋一捋:
问题分析
- 类型不匹配:你在
when分支返回的是value((Object) null),而otherwise分支返回的是row(...)构造的记录,两种返回值类型不一致,jOOQ生成SQL时会出现语法混乱。 - 语法冗余:
row(PRE_PLEADING.ID, PRE_PLEADING.TITLE,)里最后多了一个逗号,这属于代码语法错误,会直接导致生成的SQL格式异常。 - 构造器匹配风险:使用
mapping(ReceivedPleadingSummary::new)时,要确保ReceivedPleadingSummary的构造器参数顺序、类型和row里的字段完全对应,否则也可能出现隐式错误。
修正后的代码示例
context.select( // 空值分支返回与otherwise同类型的row,保证类型一致 when(PRE_PLEADING.ID.isNull(), row(val((Integer) null), val((String) null))) .otherwise(row(PRE_PLEADING.ID, PRE_PLEADING.TITLE)) .mapping(ReceivedPleadingSummary::new) ) .from(...)
关键改动说明
- 把
value((Object) null)替换成row(val(null), val(null)),让两个分支返回相同类型的行记录,jOOQ就能正确生成合法的SQL了。 - 去掉了
row里多余的末尾逗号,修复语法错误。 - 如果你的
ReceivedPleadingSummary构造器是接收ID(Integer类型)和TITLE(String类型)的,这样的映射逻辑就完全匹配,不会有问题。
另外提个小建议:如果ReceivedPleadingSummary支持无参构造器+字段setter,也可以尝试用convertFrom方法实现映射,不过用构造器直接映射的方式更简洁高效。
备注:内容来源于stack exchange,提问作者Humphrey Dino Chica
相关产品推荐
相关产品推荐

