Querydsl: Casebuilderは、検索されたcaseステートメントのデータ型を判別できませんでした

作成日 2016年07月13日  ·  5コメント  ·  ソース: querydsl/querydsl

古いコード:

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を生成)できますが、チェックされていない警告が表示されることに注意してください。

hibernate resolved

最も参考になるコメント

Hibernateは、クエリに?が含まれているタイプを認識していませんが、case式では認識している必要があります。

stackoverflowの回答のようなテンプレートを使用することはオプションです。
テンプレートにあるものはすべてそのままシリアル化します。

それ以外は、休止状態の問題です。

全てのコメント5件

どういうわけか、あなたが言及した構文は適切ではありません、あなたはこれを試すことができます:

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にキャストすることで機能させることができますが、これは予期される動作ですか?

このページは役に立ちましたか?
0 / 5 - 0 評価