在使用JPA的J2EE项目中,如何强制类似的查询不区分大小写且不区分变音?如何在Oracle 10gR2和JPA中执行类似于不区分大小写和不区分变音的操作?
我知道改变会话变量NLS_COMP和NLS_SORT,但我不知道是否有另一种伎俩在查询本身要做到这一点,在不改变会话变量
在使用JPA的J2EE项目中,如何强制类似的查询不区分大小写且不区分变音?如何在Oracle 10gR2和JPA中执行类似于不区分大小写和不区分变音的操作?
我知道改变会话变量NLS_COMP和NLS_SORT,但我不知道是否有另一种伎俩在查询本身要做到这一点,在不改变会话变量
好听的,你可以这样做
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强制将小写字母改为大写字母。结果字符串应该匹配。
(...)使用JPA,我该如何强制类似的查询不区分大小写且不区分重音?
我的答案是面向JPQL的。对于前一部分,你可以这样做:
where lower(name) like 'johny%';
对于后面的部分,我不知道一个标准的JPQL方式来做到这一点。
最后,改变会话变量NLS_COMP
和NLS_SORT
是IMO的最佳选择。
你可以使用NLS_UPPER对于不改变会话:
select 1
from dual
where nls_upper('große', 'NLS_SORT = XGerman') like '%OSSE%';
这并不能解决不区分重音的问题。 SELECT NLS_UPPER('áçgroe','NLS_SORT = XWEST_EUROPEAN_AI')“Uppercase”FROM DUAL; //返回仍然具有重音符号的GROE – AlfaTeK 2010-11-19 16:46:09
我没有查看NLS_SORT参数的所有可能值。我想应该有一个消除口音。我会在周末之后看看是否可以添加任何有用的东西。 – 2010-11-19 18:40:05
这不是JPA兼容(NO转化的支持),但它会工作中使用Hibernate/ORACLE所以我接受这个答案......希望不要不公平:) – AlfaTeK 2010-11-19 16:52:39
'不公平'或'错误'? =)您使用JPA请求了答案,并接受了与JPA不兼容的答案。 – 2016-07-25 00:05:43