当使用ibatis从数据库映射到对象时,为什么String“”被读为NULL?

时间:2009-09-08 10:50:51

标签: java oracle ibatis

在我的oracle数据库中,我有一个名为PERSON的表,其中包含列代码,姓氏,名字。

例如。 'PER001', '________________', 'Bob'(注意:_ =空格)

surname设置为NOT NULL,但您可以输入一串空格,例如“”。

我遇到了问题,因为当Ibatis将此列映射到Object时,它将其映射为NULL!何时应将其映射为“”?

有什么想法吗?

4 个答案:

答案 0 :(得分:2)

好的,我已经弄明白了!我没想到ibatis生成的setter会修剪字符串! > _>

在:

public void setSURNAME(String SURNAME) {
    this.SURNAME = SURNAME == null ? null : SURNAME.trim();
}

FIX:

public void setSURNAME(String SURNAME) {
    this.SURNAME = SURNAME == null ? null : SURNAME;
}

感谢帮帮!对不起> _>!

答案 1 :(得分:0)

将空字符串视为NULL是Oracle的一个怪癖。这在某些方面存在争议(在http://www.google.co.uk/search?q=oracle+null+“空+字符串”上搜索谷歌搜索)。 Oracle可能会在将来更改此行为。只是不要屏住呼吸。

修改

正如已经指出的那样,它不是一个空字符串,而是一串空白。那么,在这种情况下,它不是Oracle本身。

SQL> desc emp
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 EMPNO                                     NOT NULL NUMBER(4)
 ENAME                                     NOT NULL VARCHAR2(10)
 JOB                                                VARCHAR2(9)
 MGR                                                NUMBER(4)
 HIREDATE                                           DATE
 SAL                                                NUMBER(7,2)
 COMM                                               NUMBER(7,2)
 DEPTNO                                             NUMBER(2)

SQL> insert into emp (empno, ename) values (9999, '      ')
  2  /

1 row created.


SQL> select length(ename) from emp
  2  where empno = 9999
  3  /

LENGTH(ENAME)
-------------
            6
SQL>

可能的罪魁祸首是:

  1. TRIM()应用于{。}的触发器 有问题的列(或类似的 处理)

  2. IBATIS以某种方式介入

答案 2 :(得分:0)

这是在回避这个问题,但您可以选择其他字符串,例如“ - ”或“_”来表示缺失值吗?

根据被处理的空字符串的不同,被处理的空字符串与软字符串的所有部分的空字符串不同,似乎风险很大。

答案 3 :(得分:0)