有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Oracle JDBC PreparedStatement忽略尾随空格

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

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

"testFTP_receipt521      "

当我使用SQLDeveloper执行select查询时,我可以在运行时得到一个结果:

...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) 个答案

  1. # 1 楼答案

    也许你可以这样使用它

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

    这种方式会返回包含“testFTP_receipt521”的所有注册表,与空格无关

    我在这部分代码中看到的另一件事

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

    我觉得这是正确的方法

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

    你需要在标准周围加上引号

  2. # 2 楼答案

    如果你有能力修改查询,你可以修剪(…)输入列值并执行比较。例如:

    。。。和TRIM(yfs_organization.organization_KEY)=?”

    希望有帮助

  3. # 3 楼答案

    Due to a bug in the program which is writing to the database, the field I need to search for has trailing spaces

    也许,考虑到这种情况,如果Oracle的版本足够近,您可以考虑将一个virtual column添加到包含正确的EEM>值的表中吗?p>

    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所需的代码。一旦修复,可能会缓解过渡

    作为一项附加功能,如果需要,您也可以在虚拟列上添加索引