2

我在 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_?

4

1 回答 1

2

TL_Server 是一个临时表。因为 UpdateAll 查询被确定为复杂,所以必须使用临时表。我假设它被确定为复杂,因为该类有多个表,因此必须将它们连接起来,而这不能通过简单的更新来完成。

如果您的班级只有一个表,那么只需进行简单的更新即可。

如果这失败了,那么这是您的数据库平台的临时表支持的问题。确保正确设置“toplink.target-database”。你用的是什么数据库?

您似乎使用的是非常旧的 TopLink Essentials 版本?UpdateAll 支持在最新的 EclipseLink 版本中得到了显着改进,您可以考虑升级。

如果您无法使用 TopLink Essentials 使其工作,您总是可以只使用本机 SQL 查询而不是 JPQL。

于 2011-01-10T15:02:39.097 回答