在MyBatis xml中构建更新查询,但无法传递BadSqlGrammarException
这是我的查询
<update id="updateRecordingVideoStatus">
UPDATE
game_record_metadata
<set>
<if test="modifiedVideoStatus = null">
status = #{originalVideoStatus}
</if>
<if test="modifiedVideoStatus != null">
status = #{modifiedVideoStatus}
</if>
</set>
WHERE id = #{gameRecordMetadataId}
AND game_id = #{gameId}
</update>
我试过下面(没有设置标签),但不工作
<if test="modifiedVideoStatus = null">
SET status = #{originalVideoStatus}
</if>
<if test="modifiedVideoStatus != null">
SET status = #{modifiedVideoStatus}
</if>
编辑
org.springframework.jdbc.BadSqlGrammarException:
### Error updating database. Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE id = 2
AND game_id = 204' at line 5
### The error may exist in file [/Users/asd/admin-api/build/resources/main/mybatis/rel/game_recording.xml]
### The error may involve defaultParameterMap
### The error occurred while setting parameters
### SQL: UPDATE game_record_metadata WHERE id = ? AND game_id = ?
### Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE id = 2
AND game_id = 204' at line 5
; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE id = 2
AND game_id = 204' at line 5
什么才是正确的?
先谢了。
2条答案
按热度按时间e5njpo681#
问题是两个
<if>
语句都没有被选中。也就是说,test="..."
中的两个条件都为假。查询beacame不正确:发生这种情况是因为您在
test
中使用了未绑定的表列:test="modifiedVideoStatus = null"
test="modifiedVideoStatus != null"
应该首先使用
test
条件中的列名,而不是传递的参数。幸运的是,有解决这个问题的方法,但我不确定这是否有效:它们看起来令人困惑和不明显。
我建议您检查代码中的
originalVideoStatus
和modifiedVideoStatus
参数,并使用一个通用查询来更新game_record_metadata.status
列。af7jpaap2#
不知何故,如果标记中的
test:
不与null一起工作,但不是null,并且它被忽略,然后导致BadSqlGrammarException,因为更新查询中不存在SET语句。所以我传递了一个布尔参数作为flag,这样它就可以捕获firt if。
正如我所提到的