mysql MyBatis xml更新查询使用set标记抛出org.springframework.jdbc.BadSqlGrammarException

i5desfxk  于 2023-10-15  发布在  Mysql
关注(0)|答案(2)|浏览(124)

在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

什么才是正确的?
先谢了。

e5njpo68

e5njpo681#

问题是两个<if>语句都没有被选中。也就是说,test="..."中的两个条件都为假。查询beacame不正确:

UPDATE game_record_metadata
 WHERE id = #{gameRecordMetadataId}
   AND game_id = #{gameId}

发生这种情况是因为您在test中使用了未绑定的表列:

  • test="modifiedVideoStatus = null"
  • test="modifiedVideoStatus != null"

应该首先使用test条件中的列名,而不是传递的参数。幸运的是,有解决这个问题的方法,但我不确定这是否有效:

它们看起来令人困惑和不明显。
我建议您检查代码中的originalVideoStatusmodifiedVideoStatus参数,并使用一个通用查询来更新game_record_metadata.status列。

<update id="updateGameRecordMetadataStatus">
    UPDATE game_record_metadata
       SET status = #{newStatus}
     WHERE id = #{gameRecordMetadataId}
       AND game_id = #{gameId}
</update>
af7jpaap

af7jpaap2#

不知何故,如果标记中的test:不与null一起工作,但不是null,并且它被忽略,然后导致BadSqlGrammarException,因为更新查询中不存在SET语句。

<if test="modifiedVideoStatus = null"> /* assignment(NG) */
     status = #{originalVideoStatus}
</if>

所以我传递了一个布尔参数作为flag,这样它就可以捕获firt if。

-- solved
 <set>
            <if test="isModifiedVideoStatusNull">
                status = #{originalVideoStatus}
            </if>
            <if test="!isModifiedVideoStatusNull">
                status = #{modifiedVideoStatus}
            </if>
        </set>

正如我所提到的

EDIT

<if test="modifiedVideoStatus = null"> /* incorrect */      
     status = #{originalVideoStatus}
</if>

<if test="modifiedVideoStatus == null"> /* correct */      
     status = #{originalVideoStatus}
</if>

相关问题