Hibernate 使用算术运算执行更新不';t变换列

Hibernate 使用算术运算执行更新不';t变换列,hibernate,eclipselink,jpa-2.0,Hibernate,Eclipselink,Jpa 2.0,我正在尝试在某个应用程序中手动订购。 更新字段的JPAQL如下所示: update SortableBean s set s.position = s.position + 1 where s.position >= :initialPosition and s.position < :finalPosition Sortable ID - POS - VERSION ------------------ BEFORE Sortable 1 - 0 - 1 Sortable 2 -

我正在尝试在某个应用程序中手动订购。 更新字段的JPAQL如下所示:

update SortableBean s set s.position = s.position + 1 where s.position >= :initialPosition and s.position < :finalPosition
Sortable ID - POS - VERSION
------------------
BEFORE
Sortable 1 - 0 - 1
Sortable 2 - 1 - 1
Sortable 3 - 2 - 1
Sortable 4 - 3 - 1
Sortable 5 - 4 - 1
INITIAL=0 FINAL=3
UPDATED 3 ITEMS
AFTER
Sortable 4 - 0 - 2
Sortable 1 - 0 - 1
Sortable 2 - 1 - 1
Sortable 3 - 2 - 1
Sortable 5 - 4 - 1
换句话说,看起来它没有更新求和值,所以我得到了重复的位置

有什么想法吗

编辑: 生成的SQL似乎是正确的:

UPDATE sortables SET version = (version + 1), pos = (pos + 1) WHERE ((pos >= 0) AND (pos < 3))
更新排序表集版本=(版本+1),位置=(位置+1),其中((位置>=0)和(位置<3))
多亏了他和他的帮助,这让我开始思考真正的问题

问题是我正在进行批处理更新,但没有清除持久性上下文

基本上,解决办法是

我也有一个错误的断言,但这是我的问题中最小的一个


谢谢大家

请尝试在括号内分隔您的between筛选器..:其中s.position between:initialPosition和(:finalPosition-1):finalPosition应与最终值一起传递,您不能在查询中对labels@CarlosA.Junior在这种情况下,括号是隐式的。@Zeus如您所说更改了查询,错误仍然存在。您如何检查情况是否已更改?您是否考虑到JPA在EntityManager中都有缓存,并且允许在EMF中使用二级缓存?如果在更新之前缓存了实体,则可能需要刷新实体。尝试在更改后在em上调用clear或获取新的EntityManager来检查实例值。