2017-02-01 15 views
0

Я работаю с устаревшей базой данных и использует данные JPA Spring для доступа к репозиторию. Одна из таблиц имеет столбец идентификатора номера данных, но требование состоит в том, чтобы выполнить частичное совпадение с использованием символа дикой карты. Таким образом, 12 должны соответствовать 1234. Если я пишу родной запрос, я могу сделатьКак избежать преобразования типов для частичных совпадений в столбцах, основанных на численном выражении

select * from table where id like 12%

, но при использовании Spring JPA Criteria API, который обеспечивает безопасность типов, я должен сделать преобразование типа, прежде чем я мог бы использовать как оператор

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

Обратите внимание, что я должен добавить .as (String.class), чтобы быть в состоянии выполнить спичку строки с помощью like оператора. Это приводит к конверсии типа данных и запрос не в состоянии извлечь выгоду из индекса ид

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