【问题标题】:javax.persistence.NonUniqueResultException: query did not return a unique result dart springjavax.persistence.NonUniqueResultException:查询没有返回一个唯一的结果飞镖春天
【发布时间】:2020-07-14 16:37:00
【问题描述】:

我一直在使用 Spring Boot 和 Flutter。我有 3 个列表,其中每种成分存储的成分、单位和数量。我需要当用户按下save 按钮时,循环在 3 个列表之间进行迭代,并通过点击 URL 获取第 i 个索引值并存储在数据库中。

  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): 获取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没有返回唯一结果:2;嵌套异常是 javax.persistence.NonUniqueResultException:查询没有返回唯一结果:2","path":"/user/ingredient/quantity"} E/FirebaseInstanceId(12297):令牌检索失败:AUTHENTICATION_FAILED

【问题讨论】:

    标签: flutter dart dart-webui


    【解决方案1】:

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

    为此,您的函数必须返回一个 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]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-15
      • 2014-07-15
      • 1970-01-01
      • 2020-06-05
      • 1970-01-01
      • 2015-10-30
      • 2020-09-09
      相关资源
      最近更新 更多