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 关键字
我一直在使用 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 关键字