javax.persistence.NonUniqueResultException: запрос не вернул уникальный результат - PullRequest
0 голосов
/ 02 апреля 2020

Я работал с Spring Boot и Flutter. У меня есть 3 списка, в которых ингредиент, единица измерения и количество хранятся для каждого ингредиента. Мне нужно, чтобы, когда пользователь нажимал кнопку save al oop, перебирал 3 списка, получал значение i-го индекса и сохранял его в базе данных, нажимая URL.

  var unCheckedIngredients = [], unCheckedUnits = [], unCheckedQuantities = [];

                 onPressed: () {
                if (_formKey.currentState.validate()) {
                  _formKey.currentState.save();
                  for (int i=0;i<unCheckedQuantities.length;i++)
                  {
                    insertUserIngredient(unCheckedIngredients[i]);
                    insertUserUnit(unCheckedUnits[i]);
                    insertUserQuantity(unCheckedQuantities[i]);                  
                                        }
                  setState(() {
                    _formKey.currentState.reset();
                    displayChipList.clear();
                  });
                }
              },

Как вызывается 3 функции. Таким образом, он должен работать последовательно, но в DART я не понимаю, в чем проблема - он запрашивает 2-ю инструкцию сначала и 1-ю строку после нее случайным образом. Он должен работать последовательно.

Допустим, если unCheckedQuantities. length = 2 - Он выполняет первую строку в течение l oop 2 раза, а затем 2-ю строку дважды и т. Д.

Ошибка

/ флаттер (12297): GET http://10.0.2.2: 8085 / пользователь / ингредиент / количество? Ингридиент_квантовость = 3 I / флаттер (12297) : qauntity = {"timestamp": "2020-04-02T15: 29: 54.030 + 0000", "status": 500, "error": "Internal Server Error", "message": "запрос не вернул уникальный результат : 2; вложенным исключением является javax.persistence.NonUniqueResultException: запрос не вернул уникальный результат: 2 "," path ":" / user / ингридиент / количество "} E / FirebaseInstanceId (12297): ошибка при получении токена: AUTHENTICATION_FAILED

1 Ответ

1 голос
/ 07 апреля 2020

Надеюсь, вы не изменяете список количеств, пока он работает. Если это не так, выполняют ли функции вставки что-либо асинхронно? Затем вам нужно специально указать компилятору Dart остановиться на ключевом слове await. Даже если это не так, вы все равно можете использовать их для синхронного выполнения вашего процесса, но это не очень хорошая идея, когда вы делаете тяжелые вычисления

Для этого ваша функция должна возвращать Future

void insertSomething(){}

К

Future<void> insertSomething(){}

и измените ваш метод onPressed на

 () async {
  if (...) {
    for (...) {
      await insertSomething()
    }
  }
}

Дело в том, что Дарт работает подобно Node-JS неблокирующим образом, поэтому Асинхронные события могут завершаться в свое время, и когда они будут выполнены, они будут добавлены в очередь событий, и событие l oop заберет его в следующем цикле.

Теперь, когда вы не хотите это поведение, которое вы используете async / await, чтобы заставить событие l oop ожидать обработки указанного c. Вы можете взглянуть на дартпад ниже, сначала запустите его нормально, а затем попробуйте удалить ключевые слова await из результатов ()

[https://dartpad.dev/4bf516fc43a61d4a8ad5870e61eeb1e4] [1]

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