Oracle JDBC PreparedStatement忽略尾随空格

时间:2014-10-09 15:56:47

标签: java oracle jdbc

我目前正在编写一个与Oracle数据库连接的Java Web应用程序。我正在使用PreparedStatements,因为Hibernate会使事情变得太复杂。

由于程序中存在写入数据库的错误,我需要搜索的字段会将尾随空格写入该值。我用引号括起了这个值来演示空白。

"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查询此结果,还是应该尝试其他方法?

感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

  

由于程序中写入数据库的错误,我需要搜索的字段有尾随空格

根据具体情况,如果您的Oracle版本足够新,您可以考虑在包含正确值的表格中添加virtual column吗?

ALTER TABLE yfs_organization ADD (
  ORGANIZATION_KEY_FIXED VARCHAR(80)
    GENERATED ALWAYS AS (TRIM(ORGANIZATION_KEY)) VIRTUAL
  );

然后在您的代码中,唯一的变化是使用ORGANIZATION_KEY_FIXED来查询数据库:

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

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

这可以避免在应用程序周围散布解决该bug所需的代码。一旦修复过,可能会简化过渡。

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

答案 1 :(得分:0)

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

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

这种方式会返回包含'testFTP_receipt521'的所有reg,与空格无关。

我在你的代码中看到的另一件事

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

我认为这是正确的方法

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

你需要在标准附近加上引号

答案 2 :(得分:0)

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

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

希望它有所帮助。