Querydsl: O Casebuilder não conseguiu determinar o tipo de dados para a declaração de caso pesquisada

Criado em 13 jul. 2016  ·  5Comentários  ·  Fonte: querydsl/querydsl

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.

hibernate resolved

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.

Todos 5 comentários

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?

Esta página foi útil?
0 / 5 - 0 avaliações