datos de tipo desconocido cuando se utiliza un número entero sobre NamedParameterJDBCTemplate en H2 [SPRING-BOOT]

mariotepro:

Estoy probando un Dao con una base de datos en memoria con H2. Estoy pasando un int a la consulta con un mapa para ejecutarlo. Esta consulta está trabajando bien en Oracle SQL, pero no está sucediendo al de H2.

DAO

    @Override
public int deleteCancelled(int days) {
    final Map<String, Object> namedParameters = new HashMap<String, Object>();

    namedParameters.put(DAYS, days);
    namedParameters.put(STATUS, StatusEnum.CANCELLED.toString());

    int updated = this.namedParameterJdbcTemplate.update(Query.QUERIES.DELETE_CANCELLED, namedParameters);

    return updated;
}

CONSULTAS

      public static final String DELETE_CANCELLED = "DELETE FROM MY_TABLE "
      + "WHERE UPDATE_TS < SYSDATE - :days AND STATUS = :status";

Cuando trato de ejecutar esta consulta en H2, devuelve:

Error

org.springframework.jdbc.UncategorizedSQLException: 
PreparedStatementCallback; uncategorized SQLException for SQL [DELETE FROM 
MY_TABLE WHERE UPDATE_TS < SYSDATE - ? AND STATUS = ?]; SQL state 
[HY004]; error code [50004]; Unknown data type : "?"
Unknown data type: "?"; SQL statement:
DELETE FROM MY_TABLE WHERE UPDATE_TS < SYSDATE - ? AND STATUS = ? 
[50004-196]; nested exception is org.h2.jdbc.JdbcSQLException: Unknown data 
type : "?"
Unknown data type: "?"; SQL statement:
DELETE FROM MY_TABLE WHERE UPDATE_TS < SYSDATE - ? AND STATUS = ? 
[50004-196]

Traté de ejecutar la consulta hardcoding el int en la consulta (SYSDATE = 4) y funcionó, también trató de envolver int primitivo en Integer.valueOf (días) y el uso de MapSqlParameterSource para especificar qué tipo de datos es, pero ninguno de los dos trabajado.

¿Por qué no funciona? ¿Alguien sabe? Gracias por adelantado.

EDITAR:

StatusEnum

public enum StatusEnum {

CANCELLED("Cancelled"), 
CONFIRMED("Confirmed"), 
PENDING("Pending"), 
SENT("Sent"), 


private final String text;

/**
 * @param text
 */
private StatusEnum(final String text) {
    this.text = text;
}

/* (non-Javadoc)
 * @see java.lang.Enum#toString()
 */
@Override
public String toString() {
    return text;
}

}

Lucas Woodward:

Esta excepción parece surgir debido H2 está tratando de escribir a comprobar el estado en tiempo de compilación y no se puede determinar de forma única el tipo del parámetro: podría ser una fecha o podría ser un número, o tal vez algo más.

La solución (siempre en el tema GitHub Levanté ) es reemplazar

SYSDATE - ?

con

SYSDATE - CAST(? AS INTEGER)

He comprobado esto y funciona tanto en H2 y Oracle.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=138267&siteId=1
Recomendado
Clasificación