Estoy usando PostgreSQL (10.2) con jooq (3.8.7), digamos que tengo un tipo y una tabla como:
CREATE TYPE my_type AS (
id INTEGER,
name TEXT
);
CREATE table my_table (
id INTEGER,
something my_type
);
Entonces, ¿cómo voy a buscar todos los registros de mi_tabla donde my_table.something.name = 'prueba' mediante el uso de jooq? He intentado hacer algo como esto:
ctx.selectFrom(MY_TABLE)
.where(MY_TABLE.SOMETHING.NAME.eq("test")) \\ SOMETHING is a TableField
... \\ and does not have NAME field
Pero eso no funciona (se explica en los comentarios de código). Esto es lo que quiero hacer en jooq:
SELECT * FROM my_table WHERE (something).name = 'test';
Acceso a los atributos de texto definidos por el usuario a través de la DSL no se ha implementado en jOOQ 3.11. La solicitud de función en espera es relevante aquí: https://github.com/jOOQ/jOOQ/issues/228
Como siempre, cuando se ejecuta en una limitación de este tipo, se puede recurrir al uso de plantillas de SQL sin formato :
ctx.selectFrom(MY_TABLE)
.where("{0}.{1} = {2}", MY_TABLE.SOMETHING, MY_TYPE.NAME, DSL.val("test"))
...
Por supuesto, si usted está haciendo esto más a menudo, es posible que desee para envolver este tipo de lógica en su propia API de plantillas lado del cliente para mejorar la reutilización de patrones similares.