MyBatis Oracle查询不返回结果,但它应该

时间:2015-08-27 16:53:00

标签: sql-server oracle java-ee mybatis

我正在将MyBatis项目从SQL Server迁移到Oracle。使用MyBatis Oracle时,使用SQL Server工作正常的查询不起作用。 该查询有2个参数。如果我在mapper中硬编码第二个参数,我会得到结果。如果我复制生成的查询并插入日志中的参数并运行它,我会得到一个结果。很奇怪。

    <sql id="employeeBranch">
        SELECT
            brn.branch AS id,
            brn.employee_id AS employeeId,
            brn.club_cd AS clubCode,
            brn.branch AS branchCode,
            brn.role_id AS roleId,
            'N' AS defaultBranch,
            branch.name AS description
        FROM EmployeeBranch brn, branch
        WHERE brn.employee_id = #{employeeId}
            AND brn.club_cd = branch.club_cd
            AND brn.branch = branch.branch
    </sql>

    <select id="getEmployeeBranch" resultType="com.xxx.xxx.xxx.EmployeeBranchBean">
        <include refid="employeeBranch"/>
            AND brn.branch = #{branch}
    </select>

如果我将传递的参数硬编码到#{branch}中,则查询有效。如果我采用记录的查询,插入由MyBatis记录的params并手动运行它可以工作。使用MyBatis 3.2.1

这是日志:(注意没有结果。在SQL Dev中使用相同的params粘贴查询。如果我硬编码'001'参数,也可以。)

09:40:10,768 DEBUG getEmployeeBranch:132 - ooo Using Connection [1836735260, URL=jdbc:oracle:thin:@developmentdb1:1521:*****, UserName=********* , Oracle JDBC driver]
09:40:10,768 DEBUG getEmployeeBranch:132 - ==>  Preparing: SELECT empBr.branch AS id, empBr.employee_id AS employeeId, empBr.club_cd AS clubCode, empBr.branch AS branchCode, empBr.role_id AS roleId, 'N' AS defaultBranch, br.name AS description FROM EmployeeBranch empBr INNER JOIN branch br ON empBr.club_cd = br.club_cd AND empBr.branch = br.branch WHERE empBr.employee_id = ? AND empBr.branch = ? 
09:40:10,769 DEBUG getEmployeeBranch:132 - ==> Parameters: DEMO(String), 001(String)

映射器:

public EmployeeBranchBean getEmployeeBranch(
            @Param("employeeId") String employeeId,
            @Param("branchId") String branch);

呼叫:

EmployeeBranchBean branchBean = EmployeeHandler.instance().getEmployeeBranch(userName, branch);

1 个答案:

答案 0 :(得分:2)

的可能性:

  • 从SQL Server迁移到Oracle期间,EmployeeBranch.branch列的数据类型已更改,例如从VARCHAR到INT,你的JDBC驱动程序想要将Java String强制转换为它是奇怪的
  • 数据类型没有改变,但它始终是数字的,从SQL Server JDBC驱动程序切换到Oracle会导致奇怪

如果您知道或发现架构定义未发生变化,则尝试尝试(暂时)使用$ {}表示法直接注入&#34;分支&#34;值。尝试使用和不使用引号,例如:

AND brn.branch = '${branch}'

AND brn.branch = ${branch}

查看哪些,如果有的话,给出正确的结果以及是否有任何事情发生。这个实验的结果可以提供一些额外的线索。

虽然我最近没有与Oracle合作过,但我偶尔会因为SQL Server和DB2中的类似怪异而被绊倒,因为我得到了奇怪的结果,或者根本没有结果。已经有一段时间了,不幸的是,我无法回想起具体细节,但当我因这种奇怪的问题而纠结时,通常是由于数据类型的混乱。