古いコード:
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)
に置き換えてみました
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))
うまくいきませんでした。 エラーが発生します
org.hibernate.QueryException:検索されたcaseステートメントのデータ型を判別できませんでした
次に、Expressions.constant()を使用してみましたが、これも機能しませんでした。 最後に、Expressions.asBoolean()とExpressions.FALSEを試しました。これらは、メソッド呼び出しがあいまいなためにコンパイルされません。PredicateとComparableExpressionで有効です。
Expressions.FALSEをExpressionに明示的にキャストすると、コードをコンパイル(および有効なSQLを生成)できますが、チェックされていない警告が表示されることに注意してください。
どういうわけか、あなたが言及した構文は適切ではありません、あなたはこれを試すことができます:
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))
Expressions.asNumber(1)
後に追加の)
Expressions.asNumber(1)
申し訳ありませんが、コードをコピーする際のタイプミスです。 それでも同じ結果が得られます。
私はあなたがlietralsで何かをするHibernateに関連したこの解決策を試すことができると思います: http ://stackoverflow.com/questions/26648491/querydsl-could-not-determine-data-type-for-searched-case-
Hibernateは、クエリに?
が含まれているタイプを認識していませんが、case式では認識している必要があります。
stackoverflowの回答のようなテンプレートを使用することはオプションです。
テンプレートにあるものはすべてそのままシリアル化します。
それ以外は、休止状態の問題です。
やあ、
たくさんのテンプレートを試しましたが、試してみます。 特定のものはありますか? 3.xではNumberTemplateとBooleanTemplateを使用していましたが、4では今は違うと思いますか?
私はもう試した:
Expressions.asBoolean()
Expressions.constant()
Expressions.FALSE
私が言及したように、この構文は次のとおりです。
.when(Expressions.asNumber(1))
.then(Expressions.asBoolean(false))
.when(Expressions.asNumber(2))
.then(Expressions.asBoolean(true))
.otherwise(Expressions.nullExpression(Boolean.class))
結果としてコンパイルエラーが発生します( '.then(Expressions.asBoolean(false))'を使用したあいまいなメソッド呼び出し-ComparableExpressionとPredicateの両方でオーバーライドされます。結果をExpressionにキャストすることで機能させることができますが、これは予期される動作ですか?
最も参考になるコメント
Hibernateは、クエリに
?
が含まれているタイプを認識していませんが、case式では認識している必要があります。stackoverflowの回答のようなテンプレートを使用することはオプションです。
テンプレートにあるものはすべてそのままシリアル化します。
それ以外は、休止状態の問題です。