javax.persistence.NonUniqueResultException: query 没有 return 唯一的结果 dart spring

javax.persistence.NonUniqueResultException: query did not return a unique result dart spring

我一直在使用 Spring Boot 和 Flutter。我有 3 个列表,其中为每种成分存储了成分、单位和数量。我需要当用户按下 save 按钮时,在 3 个列表之间循环迭代并获取第 ith 个索引值并通过单击 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 中,我不知道问题是它首先请求第二条指令,然后随机请求第一行。 它应该按顺序工作。

假设,如果 unCheckedQuantities. length = 2 - 它在 for 循环中执行第一行 2 次,然后执行第二行两次,依此类推。

错误

/flutter (12297): GET http://10.0.2.2:8085/user/ingredient/quantity?ingredient_quantity=3 I/flutter (12297): qauntity = {"timestamp":"2020-04-02T15:29:54.030+0000","status":500,"error":"Internal Server Error","message":"query did not return a unique result: 2; nested exception is javax.persistence.NonUniqueResultException: query did not return a unique result: 2","path":"/user/ingredient/quantity"} E/FirebaseInstanceId(12297): Token retrieval failed: AUTHENTICATION_FAILED

希望您在交互时不要更改数量列表。如果不是这种情况,插入函数是否异步执行任何操作?然后你需要用 await 关键字明确告诉 Dart 编译器停止。即使它们不是,您仍然可以使用它们来同步执行您的进程,但是当您进行一些繁重的计算时,这不是一个好主意

为此,您的函数必须 return 一个 Future

void insertSomething(){}

Future<void> insertSomething(){}

并将您的 onPressed 方法更改为

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

Dart 的工作方式类似于 Node-JS 的非阻塞方式,因此异步事件可以按自己的时间完成,当它们完成时,它们将被添加到事件队列中,事件循环将下个周期捡起来。

现在,当您不希望出现这种行为时,您可以使用 async/await,强制事件循环等待特定事件得到处理。你可以看看下面的 dartpad,首先 运行 它正常,然后尝试从 results()

中删除 await 关键字

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