测试JOOQ postgres jsonb列键是否存在

我有一个表,其中包含名为tags的jsonb列。 每行中的tags元素可能包含或不包含称为group的字段。 我的目标是通过tags.grouptags包含group字段的所有行进行group 。 像下面的postgres查询一样:

 select tags->>'group' as group, sum(n) as sum from TABLE where tags ? 'group' group by tags->>'group'; 

我试图把它变成JOOQ,无法找到如何表示where tags ? 'group' where tags ? 'group'条件。

例如,

 val selectGroup = DSL.field("{0}->>'{1}'", String::class.java, TABLE.TAGS, "group") dsl().select(selectGroup, DSL.sum(TABLE.N)) .from(TABLE) .where(TABLE.TAGS.contains('group')) .groupBy(selectGroup) 

这相当于在postgres中包含条件@> 。 但是我需要做存在的条件? 。 我怎么能在JOOQ表达呢?

这里有两件值得一提的事情:

这个? JDBC中的运算符

不幸的是,这没有好的解决方案? 目前严格限制在PostgreSQL JDBC驱动程序中用作绑定变量占位符。 所以,即使你能找到一种方法通过jOOQ发送这个字符到服务器,JDBC驱动程序仍然会误解它。

在这个堆栈溢出问题中记录了一个解决方法 。

普通的SQL和字符串文字

当你在jOOQ中使用普通的SQL模板语言时,要注意有一个解析器可以解析你的字符串的某些标记,包括注释和字符串等。 这意味着你的使用…

 DSL.field("{0}->>'{1}'", String::class.java, TABLE.TAGS, "group") 

是不正确的,因为'{1}'将被解析为字符串文本并按原样发送到服务器。 如果你想使用一个可变的字符串文字,请改为:

 DSL.field("{0}->>{1}", String::class.java, TABLE.TAGS, DSL.inline("group")) 

另请参阅DSL.inline()