Как сделать нечувствительный к регистру и акцент нечувствительным в 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