2016-05-03 7 views
1

私はCriteria APIを使用して、Hibernateを実装として使用してクエリを作成しています。データベースはMS SQL Server 2014です。Criteriaクエリを使用してStringフィールドをwhere句の数値に変換するにはどうすればよいですか?

私のデータベースには、数字と文字列を含む文字列フィールドがあります。数値を数値と比較したい。 SQLでは、このようなものになるだろう:

select * 
from table 
where ISNUMERIC(table.value) and CONVERT(float, table.value) > 5 

(関数名で私を引用しないでください。)あり基準クエリでこれを行う直接的な方法のように見えるので、私は使用してみましたしません機能()メソッド:

Expression<Float> convertedExpression = criteria.function("CONVERT", Float.class, criteria.literal(Float.class), baseExpression); 

しかし、このアプローチはラà多少役に立たないエラーメッセージを与える「の近くに不正な構文)」または「@ P1の近くに不正な構文」。これは、最初のパラメータがメソッドに渡されたためです。変換する型にする必要があります。

CONVERT機能を動作させる助けや、全く異なるアプローチがあれば幸いです。

答えて

0

あなたの列をStringとしてモデル化します。そうすれば、基準apiを使ってStringに変換できます。あなたが特定のフォーマットを期待するなら、それを行う - 私はあなたのフロートを特定の文字列にフォーマットし、それを基準に渡すことを意味します。

+0

この列はすでにStringとしてマップされています(データベースのString列です)。しかし、いくつかのエントリー(すべてではありません)は実際には数字であり、私はしたいです<, >、<= or > =それらの比較。 –

+0

本当にCriteriaが必要な場合SqlProjectionは唯一のオプションのようです。その他はネイティブクエリを作成することです。 –

0

JPAのように思えますが、Criteria APIを制限するだけで、あなたが望むことはできません。 e。ファンクションコールのパラメータとして、事実上のキーワードfloatをこの場合は渡します。同様に、クエリに「ネイティブSQL条件」を追加することはできません(SQL標準CAST(...)も使用できません)。 、データベース内の既存のを使用するか、必要なタイプ(例えばFLOAT(str))あたりのカスタム変換関数を作成し、次のいずれかこれには、唯一の方法は、データベースレベルでこれを解決するに思える...正当な理由のために、うまくいけば

ですテーブルの代わりに数値列を定義して使用することもできます(たとえば、トリガを使用してソース文字列と最新の状態に保つこともできます)。

ところでこの質問は、How to properly cast string to number with JPA2 Criteria API?と重複しているようです。

関連する問題