在Oracle中,CHAR类型的字段值会自动补足空格。所以当其作为条件时,就有可能查不出想要的数据。
如果不允许改DB设计的话,那就用RTRIM来解决吧。例:
DB:
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->CREATE TABLE TEST
(
TEST_ID VARCHAR2(64) NOT NULL,
TEST_CHAR CHAR(10),
CONSTRAINT TEST_ID PRIMARY KEY (TEST_ID)
);
INSERT INTO TEST VALUES("1","a");
测试代码:
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->Session session = factory.getCurrentSession();
session.beginTransaction();
List list = session.createQuery("FROM Test WHERE RTRIM(TEST_CHAR) = "a"").list();
session.close();
assertTrue(list.size() > 0);
输出结果(ORACLE):
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->Hibernate:
select
test0_.TEST_ID as TEST1_0_,
test0_.TEST_CHAR as TEST4_0_
from
TEST test0_
where
rtrim(TEST_CHAR)="a"
14:09:53,171DEBUG StringType:172 - returning "1" as column: TEST1_0_
14:09:53,187DEBUG StringType:172 - returning "a " as column: TEST4_0_
而MySQL不会自动补足空格,同样的代码也是可以适用的:
输出结果(MySQL):
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->Hibernate:
select
test0_.TEST_ID as TEST1_0_,
test0_.TEST_CHAR as TEST4_0_
from
TEST test0_
where
rtrim(TEST_CHAR)="a"
14:09:01,828DEBUG StringType:172 - returning "1" as column: TEST1_0_
14:09:01,828DEBUG StringType:172 - returning "a" as column: TEST4_0_Oracle相关:Rman Crosscheck删除失效归档Oracle???引存储关系到数据库的运行效率相关资讯 Oracle教程
- Oracle中纯数字的varchar2类型和 (07/29/2015 07:20:43)
- Oracle教程:Oracle中查看DBLink密 (07/29/2015 07:16:55)
- [Oracle] SQL*Loader 详细使用教程 (08/11/2013 21:30:36)
| - Oracle教程:Oracle中kill死锁进程 (07/29/2015 07:18:28)
- Oracle教程:ORA-25153 临时表空间 (07/29/2015 07:13:37)
- Oracle教程之管理安全和资源 (04/08/2013 11:39:32)
|
本文评论 查看全部评论 (0)