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.
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?
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.