测试JOOQ postgres jsonb列的密钥存在

时间:2017-09-09 04:06:21

标签: postgresql kotlin jooq

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

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

我正在尝试将其转换为JOOQ,但无法找出如何表达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中表达出来?

1 个答案:

答案 0 :(得分:0)

这里有两件事值得一提:

JDBC中的?运算符

不幸的是,由于?目前严格限制在PostgreSQL JDBC驱动程序中用作绑定变量占位符,因此没有很好的解决方案。因此,即使您可以找到通过jOOQ将该字符发送到服务器的方法,JDBC驱动程序仍然会误解它。

A workaround is documented in this Stack Overflow question

纯SQL和字符串文字

当你在jOOQ中使用plain SQL templating language时,请注意有一个解析器会解析你的字符串的某些标记,包括例如注释和字符串文字。这意味着您使用...

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()