我正在将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);
答案 0 :(得分:2)
的可能性:
如果您知道或发现架构定义未发生变化,则尝试尝试(暂时)使用$ {}表示法直接注入&#34;分支&#34;值。尝试使用和不使用引号,例如:
AND brn.branch = '${branch}'
和
AND brn.branch = ${branch}
查看哪些,如果有的话,给出正确的结果以及是否有任何事情发生。这个实验的结果可以提供一些额外的线索。
虽然我最近没有与Oracle合作过,但我偶尔会因为SQL Server和DB2中的类似怪异而被绊倒,因为我得到了奇怪的结果,或者根本没有结果。已经有一段时间了,不幸的是,我无法回想起具体细节,但当我因这种奇怪的问题而纠结时,通常是由于数据类型的混乱。