{
"id": 1,
"name": "First-Search",
"steps": [
{
"id": 1,
"subSearchId": 1,
"step": 1
},
{
"id": 3,
"subSearchId": 1,
"step": 2
},
{
"id": 2,
"subSearchId": 1,
"step": 3
}
]
}
在这个json中,我想更新 steps [] 数组元素步骤号。 如果我交换步骤值,他们也应该在db中更新,
条件
我的表格对 subSearchId 和步骤
的组合有唯一的关键限制我不想在更新前删除所有记录。
有没有更新此
的最佳方法myController的
JsonNode json = request().body().asJson();
final SubSearch t = Json.fromJson(json, SubSearch.class);
SubSearchDao tdao = new SubSearchDao();
SubSearchStepDao stdao = new SubSearchStepDao();
SubSearch subSearch = tdao.findById(t.id);
SubSearchStep sst = null;
SubSearchStep sstTmp = null;
boolean orderChanged = false;
// orderChanged = subSearch.steps.stream().filter(p -> p.step != (t.steps.stream().filter(p1 -> p1.id!=null && p1.id.equals(p.id)).findFirst()).get().step).findFirst().isPresent();
for (int i = 0; i < subSearch.steps.size(); i++) {
sst = t.steps.get(i);
sstTmp = subSearch.steps.get(i);
if (sst.id != null) {
// true, means steps has been updated
if (sst.step != sstTmp.step) {
orderChanged = true;
// sst.id=null;
}
}
}
if (orderChanged) {
stdao.deleteAll(subSearch);
return ok(Json.toJson(tdao.update(t)));
} else {
return ok(Json.toJson(tdao.update(t)));
}
现在我在更新前删除所有条目,如果我收到任何订单更改。
数据库:
id subSearchId step
------ ----------- --------
1 1 1
2 1 3
3 1 2
我想要交换步骤并且( subSearchId步骤)是唯一的。
答案 0 :(得分:0)
这听起来像是JPA无法处理的事情,因为没有办法安排更新语句以便它们不会失败。您需要将数据库设置为仅在事务完成时检查约束,而不是在语句级别检查。如果无法做到这一点,则需要删除约束或继续删除所有约束。