Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

306
Vistas
no se puede hacer una cláusula where con jooq DSL en Kotlin/Java

Estoy tratando de ejecutar una consulta de la siguiente forma con jooq en Kotlin:

 val create = DSL.using(SQLDialect.POSTGRES) val query: Query = create.select().from(DSL.table(tableName)) .where(DSL.field("timestamp").between("1970-01-01T00:00:00Z").and("2021-11-05T00:00:00Z")) .orderBy(DSL.field("id").desc())

El código de arriba me da:

 syntax error at or near \"and\

Además, al observar esta consulta en el depurador, query.sql muestra como:

 select * from data_table where timestamp between ? and ? order by id desc

No estoy seguro si el ? indica que no pudo representar los valores en SQL o de alguna manera son algún tipo de marcadores de posición.

Además, el código funciona sin la cadena where .

Además, en la línea de comando de Postgres puedo ejecutar lo siguiente y la consulta se ejecuta:

 select * from data_table where timestamp between '1970-01-01T00:00:00Z' and '2021-11-05T00:00:00Z' order by id

Al consultar los tipos de datos en el esquema, el tipo de columna de timestamp de tiempo se representa como timestamp without time zone .

Antes había declarado variables como:

 val lowFilter = "1970-01-01T00:00:00Z" val highFilter = "2021-11-05T00:00:00Z"

y esto no funcionó y parece que pasar cadenas sin procesar tampoco funciona. Soy muy nuevo en esto, así que estoy bastante seguro de que estoy estropeando el uso aquí.

EDITAR Siguiendo la sugerencia de @nulldroid, hizo algo como:

 .where(DSL.field("starttime").between(DSL.timestamp("1970-01-01T00:00:00Z")).and(DSL.timestamp("2021-11-05T00:00:00Z")))

y esto resultó en:

 Type class org.jooq.impl.Val is not supported in dialect POSTGRES"
over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

No usar el generador de código:

Voy a suponer que tiene una buena razón para no usar el generador de código para esta consulta en particular, la razón principal suele ser que su esquema es dinámico.

Entonces, la forma correcta de escribir su consulta es esta:

 create.select() .from(DSL.table(tableName)) // Attach a DataType to your timestamp field, to let jOOQ know about this .where(DSL.field("timestamp", SQLDataType.OFFSETDATETIME) // Use bind values of a temporal type .between(OffsetDateTime.parse("1970-01-01T00:00:00Z")) .and(OffsetDateTime.parse("2021-11-05T00:00:00Z"))) .orderBy(DSL.field("id").desc())

Observe cómo estoy usando tipos de datos temporales reales, no cadenas para comparar fechas y declarar campos.

Supongo, según las marcas de tiempo UTC de su pregunta, que está usando TIMESTAMPTZ . De lo contrario, si está utilizando TIMESTAMP , simplemente reemplace OffsetDateTime por LocalDateTime ...

Usando el generador de código

Si usa el generador de código, que siempre se recomienda si su esquema no es dinámico, escribiría casi lo mismo que arriba, pero escriba con seguridad:

 create.select() .from(MY_TABLE) // Attach a DataType to your timestamp field, to let jOOQ know about this .where(MY_TABLE.TIMESTAMP // Use bind values of a temporal type .between(OffsetDateTime.parse("1970-01-01T00:00:00Z")) .and(OffsetDateTime.parse("2021-11-05T00:00:00Z"))) .orderBy(MY_TABLE.ID.desc())
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda