2017-02-01 4 views
0

私はレガシーデータベースで作業しており、SpringデータJPAをリポジトリアクセスに使用しています。テーブルの1つに数値データ型のID列がありますが、ワイルドカード文字を使用して部分一致を実行できる必要があります。だから、12は私がネイティブクエリを書いていた場合、私は数値ベースの列の部分一致の型変換を回避する方法

select * from table where id like 12%

を行うことができます1234と一致する必要がありますが、型の安全性を提供春JPA基準のAPIを使用しているとき、私は私のようなを使用することができる前に型変換を行う必要がありますオペレータ

cb.like(root.get(SomeEntity_.id).as(String.class), str + "%") 

私はlike演算子を使用して文字列の一致を実行できるようにの.as(String.class)を追加する必要があります注意してください。これは、データ型変換をもたらし、クエリはID索引

cast(table0_1_.id as varchar(255)) like ?

の恩恵を受けることができないタイプの変換を実行することなく、この数ベースの列のような試合を実行する方法はありますか?

答えて

0

LIKE操作を数値データ型に適用すると、予期しない結果が生じることがあります。Referenceを参照して、SQL Serverの警告を確認してください。

データ型が異なる場合、または特定の操作が特定のデータ型の要件を示すときに、データベースが値のインプレース強制を実行することがあることもあります。

したがって、id LIKE 12%と書いても、内部ではそれが強制的にCAST(id as VARCHAR(255)) LIKE '12%'になっていないという証拠はありますか?

しかし、特にあなたの質問に答えるために、無JPA CriteriaBuilderクラスが明示的like()操作を使用したいとき、式Stringデータ型でなければならないことを示しています。だからあなたはあなたの投稿が示すようにそれをキャストするか、その列が既に上記タイプであることを確認する必要があります。

+0

意味があります。参考になりました。 – adeelmahmood

関連する問題