我在JPA(toplink)上有非常简单的命名查询:
UPDATE Server s SET s.isECM = 0
我没有携带已经预加载的实体的缓存或有效性。但是数据库连接是从受限帐户执行的(仅限INSERT / UPDATE / DELETE)。看来这个查询的toplink执行(并且因为TL_Server不存在而失败)非常奇怪的SQL:
INSERT INTO TL_Server (elementId, IsECM)
SELECT t0.ElementId, ?
FROM Element t0, Server t1
WHERE ((t1.elementId = t0.ElementId) AND (t0.elementType = ?))
bind => [0, Server]
这是什么?如何将简单的UPDATE显示为INSERT?为什么toplink查询TL _?
答案 0 :(得分:2)
TL_Server是临时表。由于确定UpdateAll查询很复杂,因此必须使用临时表。我认为它确定是复杂的,因为该类有多个表,所以它们必须连接,这不能在简单的更新中完成。
如果你上课只有一个表,那么只需要进行简单的更新。
如果失败,则数据库平台的临时表支持存在问题。确保正确设置“toplink.target-database”。你在用什么数据库?
您似乎使用的是旧版本的TopLink Essentials? UpdateAll支持在最新的EclipseLink版本中得到了很大改进,您可以考虑升级。
如果使用TopLink Essentials无法使用它,您可以始终只使用本机SQL查询而不是JPQL。