2014-10-09 85 views
0

我正在编写一个与Oracle数据库接口的Java Web应用程序。我使用PreparedStatements,因为Hibernate会让事情变得复杂。Oracle JDBC PreparedStatement忽略尾部空格

由于正在写入数据库的程序中存在一个错误,因此我需要搜索的字段具有写入该值的尾随空格。我用引号包围了这个值来演示空格。

"testFTP_receipt521  " 

当我做的SQLDeveloper选择查询,我能得到一个结果,当我运行:

...and yfs_organization.ORGANIZATION_KEY='testFTP_receipt521'; 

(无空格)

然而,当我使用PreparedStatement,我没有得到任何结果当我尝试:

...and yfs_organization.ORGANIZATION_KEY=?"); 
preparedStatement.setString(1, "testFTP_receipt521"); 

(无空格)

,当我尝试:

...and yfs_organization.ORGANIZATION_KEY=?"); 
preparedStatement.setString(1, "testFTP_receipt521  "); 

(含空格)

有没有我可以为这个结果与一个PreparedStatement查询任何方式,或者我应该尝试其他的方法呢?

感谢您的帮助。

+0

希望它可以帮助我没想到这一点,但是可能返回testFTP_receipt521_test,除了结果我想。 – user1472409 2014-10-09 15:59:44

+0

你可以试试'TRIM(yfs_organization.ORGANIZATION_KEY)=?'。 – OldCurmudgeon 2014-10-09 16:02:33

回答

0

也许你可以使用它像这样...

...and yfs_organization.ORGANIZATION_KEY like '%testFTP_receipt521%'; 

这种方式将返回所有reg其中包含“testFTP_receipt521”独立的空白。

,我在你的代码看到这部分

...and yfs_organization.ORGANIZATION_KEY=?"); 
preparedStatement.setString(1, "testFTP_receipt521"); 

我的东西,这是正确的方式

...and yfs_organization.ORGANIZATION_KEY='?'"); 

你需要把各地的标准报价Antoher事情

1

由于写入数据库的程序中存在缺陷,因此我需要对字段CH对于已经尾随所述的情况下空间

也许,如果你的Oracle版本是足够近,可以考虑增加一个virtual column含有正确值的表?

ALTER TABLE yfs_organization ADD (
    ORGANIZATION_KEY_FIXED VARCHAR(80) 
    GENERATED ALWAYS AS (TRIM(ORGANIZATION_KEY)) VIRTUAL 
); 
在你的代码

然后,唯一的变化是使用ORGANIZATION_KEY_FIXED查询DB:

SELECT ID,ORGANIZATION_KEY_FIXED 
    FROM yfs_organization 
    WHERE ORGANIZATION_KEY_FIXED='testFTP_receipt521' 

(试试http://sqlfiddle.com/#!4/8251d/1

这可能避免散在你们应用需要解决该错误的代码。一旦它得到修复,可能会缓解过渡。

作为一个额外的好处,如果您也需要,可以在虚拟列上添加索引。

0

如果您有修改查询的能力,您可以TRIM(...)列值并执行比较。例如:?

...和TRIM(yfs_organization.ORGANIZATION_KEY)=“);