java db2 jooq

java - jooq spring boot



jOOQ-Render IN como está en vez de EXISTS (1)

Necesito consultar usando un predicado "IN" sin embargo, jOOQ convierte mi "IN" como "EXISTS" + 2x selecciones anidadas. Sin embargo, en DB2, la "IN" es mucho más rápida (500 ms frente a 8 s). ¿Cómo puedo hacer cumplir jOOQ para renderizar mi predicado "IN" exastly de la misma manera que lo he descrito a través de DSL API?

Código de muestra :

try (Connection connection = DriverManager.getConnection("jdbc:h2:mem:")) { Settings settings = new Settings().withRenderFormatted(true); DSLContext ctx = DSL.using(connection, SQLDialect.SQL99, settings); ctx .createTable("FOOBAR") .column("FOO", SQLDataType.INTEGER) .column("BAR", SQLDataType.INTEGER) .execute(); String sql = ctx .select() .from(DSL.tableByName("FOOBAR")) .where( DSL.row(DSL.fieldByName("FOO")).in(ctx .select(DSL.fieldByName("BAR")) .from(DSL.tableByName("FOOBAR")) ) ) .getSQL(); System.out.println(sql); }

Resultado:

select * from "FOOBAR" where exists ( select "alias_2"."alias_2_0" from ( select "BAR" from "FOOBAR" ) "alias_2"("alias_2_0") where ("FOO") = ("alias_2"."alias_2_0") )


El dialecto SQLDialect.SQL99 no fue nombrado sensiblemente. Sugiere que generará SQL que debería ejecutarse en cualquier base de datos, pero eso no es correcto. Simplemente generará SQL "predeterminado". Esto se corregirá en jOOQ 3.6: # 3844

Para optimizar la generación de SQL para usar con la base de datos DB2, debe usar el dialecto SQLDialect.DB2 . El problema que has encontrado aquí no será el único ...