O código antigo:
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)
Eu tentei substituí-lo por
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 não funcionou. Eu entendi o erro
org.hibernate.QueryException: Não foi possível determinar o tipo de dados para a declaração de caso pesquisada
Em seguida, tentei usar Expressions.constant (), que também não funcionou. Por fim, tentei Expressions.asBoolean () e Expressions.FALSE, que não compilam devido à chamada de método ambígua: válido em Predicate e ComparableExpression.
Devo observar que converter explicitamente Expressions.FALSE em Expression permite que o código seja compilado (e gere SQL válido), embora agora haja avisos não verificados.
De alguma forma, a sintaxe que você mencionou não é adequada, você poderia tentar isto:
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))
Veja o )
extra após Expressions.asNumber(1)
Minhas desculpas - erro de digitação ao copiar o código. Ainda consigo o mesmo resultado.
Acho que você pode tentar essa solução que estava relacionada ao Hibernate fazer algo com lietrals: http://stackoverflow.com/questions/26648491/querydsl-could-not-determine-data-type-for-searched-case- declaração # resposta -27190771
O Hibernate não sabe que tipo ?
está na consulta, mas precisa saber nas expressões case.
Usar modelos como a resposta em stackoverflow é uma opção.
Isso nos faz serializar tudo o que está no modelo como está.
Fora isso, é um problema de hibernação.
Oi,
Vou tentar - embora já tenha tentado vários modelos. Existe um específico? No 3.x eu estava usando NumberTemplate e BooleanTemplate, mas no 4 eu acredito que agora é diferente?
Eu tentei:
Expressions.asBoolean ()
Expressions.constant ()
Expressions.FALSE
Porém, como mencionei, esta sintaxe:
.when(Expressions.asNumber(1))
.then(Expressions.asBoolean(false))
.when(Expressions.asNumber(2))
.then(Expressions.asBoolean(true))
.otherwise(Expressions.nullExpression(Boolean.class))
resulta em um erro de compilação (chamada de método ambígua com '.then (Expressions.asBoolean (false))' - ambos substituídos em ComparableExpression e Predicate se aplicam. Posso fazer funcionar convertendo o resultado para Expression, esse é o comportamento esperado?
Comentários muito úteis
O Hibernate não sabe que tipo
?
está na consulta, mas precisa saber nas expressões case.Usar modelos como a resposta em stackoverflow é uma opção.
Isso nos faz serializar tudo o que está no modelo como está.
Fora isso, é um problema de hibernação.