【问题标题】:toplink prefixes table with TL_ while update operation更新操作时使用 TL_ 为表添加前缀
【发布时间】:2011-06-06 14:10:53
【问题描述】:

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

【问题讨论】:

    标签: jpa toplink


    【解决方案1】:

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

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

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

    您似乎使用的是非常旧的 TopLink Essentials 版本?最新的 EclipseLink 版本对 UpdateAll 的支持有了很大的改进,您可以考虑升级。

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

    【讨论】:

    • 我很清楚为什么toplink失败了(见上文-因为数据库帐户没有创建表的权限,所以ant TL_会失败)。我的问题是有什么方法可以告诉 toplink 根本不使用临时表?或者向 JPA 提示它确实是非常简单的查询。无论如何感谢(+1)本机查询的想法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-05
    • 1970-01-01
    相关资源
    最近更新 更多