Синтаксис ошибок при использовании foreach в теге обновления в mybatis - PullRequest
1 голос
/ 05 августа 2020

Привет, теперь я использую mybatis для создания динамического c sql в Spring boot framework. и база данных mysql. Я запускаю его локально, сервер sql это MYSQL 8.0.21 . Для mybatis я использую (build.gradle)

    compile('org.mybatis:mybatis:3.4.6')
    compile('org.mybatis.spring.boot:mybatis-spring-boot-starter:1.3.2')
    compile('mysql:mysql-connector-java:8.0.13')

Когда я пытался сделать это в. xml file:

    <update id="update" parameterType="java.util.List" keyProperty="id">
        <foreach collection="list" item="answer" index="index" separator=";">
            UPDATE Answer
            SET RequestId=#{answer.requestId}, QuestionId=#{answer.questionId}, QuestionnaireId = #{answer.questionnaireId},
            AnswerText = #{answer.content}, AnswerChoiceId = #{answer.choiceId}, CreatedTime = #{answer.createdTime},
            LastUpdatedTime = #{answer.lastUpdatedTime}
            WHERE AnswerId = #{answer.id}
        </foreach>
    </update>

, он отлично работает, если я просто передайте один элемент, подобный этому (Json, примеры ниже просто показывают вам поля, это не означает, что я передаю значения в этом формате. На самом деле, я конвертирую следующие примеры как список в java) :

[
    {   
        "id": 2,
        "requestId": 2,
        "questionnaireId": 3,
        "questionId": 5,
        "content": "PROD",
        "choiceId": 8,
        "createdTime": "2020-08-04 20:50:41"
    } 
]

, но когда я добавляю два элемента, возникает ошибка:

[
    {   
        "id": 2,
        "requestId": 2,
        "questionnaireId": 3,
        "questionId": 5,
        "content": "PROD",
        "choiceId": 8,
        "createdTime": "2020-08-04 20:50:41"
    },
    {
        "id": 3,
        "requestId": 2,
        "questionnaireId": 3,
        "questionId": 5,
        "content": "LAB",
        "choiceId": 7,
        "createdTime": "2020-08-04 20:50:41"
    }

]

Сообщение об ошибке:

 "\n### 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 'UPDATE Answer\n            SET RequestId=2, QuestionId=5, QuestionnaireId = 3,\n  ' at line 7\n### The error may involve com.sample.demo.example.repository.mapper.AnswerMapper.update-Inline\n### The error occurred while setting parameters\n### SQL: UPDATE Answer             SET RequestId=?, QuestionId=?, QuestionnaireId = ?,             AnswerText = ?, AnswerChoiceId = ?, CreatedTime = ?,             LastUpdatedTime = ?             WHERE AnswerId = ?          ;              UPDATE Answer             SET RequestId=?, QuestionId=?, QuestionnaireId = ?,             AnswerText = ?, AnswerChoiceId = ?, CreatedTime = ?,             LastUpdatedTime = ?             WHERE AnswerId = ?\n### 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 'UPDATE Answer\n            SET RequestId=2, QuestionId=5, QuestionnaireId = 3,\n  ' at line 7\n; 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 'UPDATE Answer\n            SET RequestId=2, QuestionId=5, QuestionnaireId = 3,\n  ' at line 7",

Кажется ошибка при итерации по списку? Также я не вижу ошибок в моем коде, может ли кто-нибудь помочь?

Обновление Я также пытался добавить ";" в конце, а также «НАЧАЛО» и «КОНЕЦ». По-прежнему не повезло

        BEGIN
        <foreach collection="list" item="answer" index="index" separator=";">
            UPDATE Answer
            SET RequestId=#{answer.requestId}, QuestionId=#{answer.questionId}, QuestionnaireId = #{answer.questionnaireId},
            AnswerText = #{answer.content}, AnswerChoiceId = #{answer.choiceId}, CreatedTime = #{answer.createdTime},
            LastUpdatedTime = #{answer.lastUpdatedTime}
            WHERE AnswerId = #{answer.id}
        </foreach>
        ;
        END;

Последний вопрос: я знаю, что это не пакетная операция. Так сделайте l oop в java или используйте этот foreach в mybatis. что лучше? Я думал, что с помощью foreach может быть немного быстрее?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...