testing JOOQ postgres jsonb column for key exists

Tengo una tabla TABLE que contiene una columna jsonb llamada tags . El elemento de tags en cada fila puede contener o no un campo llamado group . Mi objective es agrupar por tags.group para todas las filas donde las tags contienen un campo de group . Como la siguiente consulta postgres:

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

Estoy tratando de convertirlo en JOOQ y no puedo encontrar la forma de express las where tags ? 'group' condición de where tags ? 'group'

Por ejemplo,

 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) 

Esto es equivalente a probar contiene condition @> en postgres. Pero necesito hacer ¿existe la condición ? . ¿Cómo puedo express eso en JOOQ?

Hay dos cosas que vale la pena mencionar aquí:

El ? operador en JDBC

Desafortunadamente, no hay una buena solución para esto como ? actualmente está estrictamente limitado para ser utilizado como un marcador de position variable en el controller JDBC de PostgreSQL. Por lo tanto, incluso si pudiera encontrar una forma de enviar ese carácter al server a través de jOOQ, el controller JDBC aún lo malinterpretaría.

Una solución temporal está documentada en esta pregunta sobre desbordamiento de stack .

SQL simple y literales de cadena

Cuando utiliza el lenguaje de templates SQL sencillo en jOOQ, tenga en count que hay un analizador sintáctico que analizará ciertos tokens de su cadena, incluidos, por ejemplo, comentarios y literales de cadenas. Esto significa que su uso de …

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

es incorrecto, ya que '{1}' se analizará como un literal de cadena y se enviará al server tal como está. Si desea utilizar una cadena de caracteres literal, haga esto en su lugar:

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

Ver también DSL.inline()

  • @Param no funciona en Spring Data JPA