Querydsl: Casebuilder no pudo determinar el tipo de datos para la declaración de caso buscada

Creado en 13 jul. 2016  ·  5Comentarios  ·  Fuente: querydsl/querydsl

El código antiguo:

new CaseBuilder() .when(foo.id.eq(NumberTemplate.create(Integer.class, "1").then(BooleanTemplate.FALSE) .when(foo.id.eq(NumberTemplate.create(Integer.class, "2").then(BooleanTemplate.TRUE) .otherwise(new NullExpression<>(Boolean.class)

Intenté reemplazarlo con

new CaseBuilder() .when(foo.id.eq(Expressions.asNumber(1).then(false) .when(foo.id.eq(Expressions.asNumber(2)).then(true) .otherwise(Expressions.nullExpression(Boolean.class))

que no funcionó. Me sale el error

org.hibernate.QueryException: no se pudo determinar el tipo de datos para la declaración del caso buscado

Luego intenté usar Expressions.constant (), que tampoco funcionó. Finalmente, probé Expressions.asBoolean () y Expressions.FALSE, que no se compila debido a una llamada de método ambigua: válida en Predicate y ComparableExpression.

Debo señalar que la conversión explícita de Expressions.FALSE a Expression permite que el código se compile (y genere SQL válido), aunque ahora hay advertencias sin marcar.

hibernate resolved

Comentario más útil

Hibernate no sabe qué tipo ? hay en la consulta, pero necesita saberlo en caso de expresiones.

El uso de plantillas como la respuesta en stackoverflow es una opción.
Nos hace serializar lo que esté en la plantilla tal como está.

Aparte de eso, es un problema de hibernación.

Todos 5 comentarios

De alguna manera, la sintaxis que mencionaste no es adecuada, ¿podrías probar esto?

new CaseBuilder()
.when(foo.id.eq(Expressions.asNumber(1))).then(false)
.when(foo.id.eq(Expressions.asNumber(2))).then(true)
.otherwise(Expressions.nullExpression(Boolean.class))

Ver los ) adicionales después de Expressions.asNumber(1)

Mis disculpas - error tipográfico al copiar el código. Sigo obteniendo el mismo resultado.

Supongo que puede probar esta solución que estaba relacionada con Hibernate haciendo algo con lietrals: http://stackoverflow.com/questions/26648491/querydsl-could-not-determine-data-type-for-searched-case- declaración # respuesta -27190771

Hibernate no sabe qué tipo ? hay en la consulta, pero necesita saberlo en caso de expresiones.

El uso de plantillas como la respuesta en stackoverflow es una opción.
Nos hace serializar lo que esté en la plantilla tal como está.

Aparte de eso, es un problema de hibernación.

Hola,

Lo intentaré, aunque he probado numerosas plantillas. ¿Existe alguno específico? En 3.x estaba usando NumberTemplate y BooleanTemplate pero en 4 creo que ahora es diferente.

He intentado:

Expressions.asBoolean ()
Expressions.constant ()
Expresiones FALSO

Sin embargo, como mencioné, esta sintaxis:

.when(Expressions.asNumber(1))
.then(Expressions.asBoolean(false))
.when(Expressions.asNumber(2))
.then(Expressions.asBoolean(true))
.otherwise(Expressions.nullExpression(Boolean.class))

da como resultado un error de compilación (llamada de método ambigua con '.then (Expressions.asBoolean (false))' - ambos anulados en ComparableExpression y Predicate se aplican. Puedo hacer que funcione enviando el resultado a Expression, ¿es este el comportamiento esperado?

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

okihouse picture okihouse  ·  5Comentarios

heesuk-ahn picture heesuk-ahn  ·  5Comentarios

beamofsoul picture beamofsoul  ·  6Comentarios

viktorgt picture viktorgt  ·  3Comentarios

d-schmidt picture d-schmidt  ·  5Comentarios