测试JOOQ postgres jsonb列键是否存在
我有一个表,其中包含名为tags
的jsonb列。 每行中的tags
元素可能包含或不包含称为group
的字段。 我的目标是通过tags.group
为tags
包含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()