Как сделать нечувствительный к регистру и акцент нечувствительным в Oracle 10gR2 и JPA?

В проекте J2EE, используя JPA, как я могу заставить подобный запрос быть чувствительным к регистру и нечувствительным к акценту?

Я знаю об изменении переменных сеанса NLS_COMP и NLS_SORT, но мне интересно, есть ли другой трюк для этого в самом запросе, без изменения переменных сеанса

Ответ 1

Грубо, вы можете сделать что-то вроде

select  upper(convert('This is a têst','US7ASCII')),
        upper(convert('THIS is A test','US7ASCII'))
from dual;

select  1 from dual 
where upper(convert('This is a têst','US7ASCII')) =
             upper(convert('THIS is A test','US7ASCII'))

CONVERT уменьшает символы с акцентом до сопоставленного эквивалента ASCII, а UPPER заставляет строчный регистр в верхнем регистре. Результирующие строки должны быть сопоставимыми.

Ответ 2

(...) с использованием JPA, как я могу заставить подобный запрос быть нечувствительным к регистру и не чувствительным к акценту?

Мой ответ будет ориентирован на JPQL. Для первой части вы можете сделать:

where lower(name) like 'johny%';

Для более поздней части я не знаю стандартного метода JPQL для этого.

В конце, изменение переменных сеанса NLS_COMP и NLS_SORT является лучшим вариантом IMO.

Ответ 3

Вы можете использовать NLS_UPPER для этого без изменения сеанса:

select 1
from dual
where nls_upper('große', 'NLS_SORT = XGerman') like '%OSSE%';

Документация NLS_UPPER