我目前正在编写一个与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查询此结果,还是应该尝试其他方法?
感谢您的帮助。
答案 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)=?“);
希望它有所帮助。