当某个select参数为null时,mybatis select查询不会返回结果



我需要一些关于Mybatis/Java的帮助。

我在我的映射器中有以下选择:

<select id="findTxnByBusinessKey" parameterType="map" resultType="data.Transaction">SELECT 
t.id, *MANY OTHER FIELDS NOT SHOWN HERE* FROM txns t 
where source=#{source} and userid=#{userid} and transactiontype=#{transactiontype} and ordernumber=#{ordernumber} and utrn=#{utrn}
</select>

以下是我检索事务的Java代码:

HashMap keys = new HashMap();
keys.put("userid", userid);
keys.put("source", source);
keys.put("ordernumber", ordernumber);
keys.put("transactiontype", transactiontype);
keys.put("utrn", null); <--- *****SEE THIS LINE********
//keys.put("utrn", "1234"); <--- WORKS FINE
Transaction t = session.selectOne("findTxnByBusinessKey", keys);
return t;

我知道数据库中有一行urtn列的值为null。我在数据库上用";utrn为空";子句,并返回行。但是上面的代码并没有返回该行。其他参数的值正确。当我为utrn字段传递有效值时,代码运行良好。

知道当UTRN参数为null时,如何让mybatis生成UTRN为null吗?

谢谢!

之所以会出现这种情况,是因为如果没有值集,SQL语句将不正确。您需要使用if子句调整语句并测试参数。因此,您在这里要做的是创建一个动态SQL语句。

您需要更改以下语句:

<select id="findTxnByBusinessKey"
resultType="data.Transaction">
SELECT t.id, .... FROM txns t 
WHERE source=#{source}
<if test="userid != null">
AND userid=#{userid}
</if>
<if test="userid == null">
AND userid IS NULL
</if>
...
</select>

请确保所需的参数是名称优先,因为如果第一个参数为null并被忽略,"... where and userid=..."将是不正确的sql语法。

如果你有更多的条件,你可以在mybatis中使用when,它可以有很多条件,在任何其他情况下都有一个默认条件。

最新更新