【问题标题】:MYSQL nested queries in JPA NativeQueryJPA NativeQuery 中的 MYSQL 嵌套查询
【发布时间】:2014-02-15 08:25:12
【问题描述】:

我正在尝试实现嵌套子集算法来处理关系数据库 (MySQL) 中的层次结构。

具体来说,我在 http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ 关注这个优秀的指南

插入算法给出以下查询来插入一个新节点并对所有节点重新编号:

SELECT @myRight := rgt FROM nested_category
WHERE name = 'TELEVISIONS';

UPDATE nested_category SET rgt = rgt + 2 WHERE rgt > @myRight;
UPDATE nested_category SET lft = lft + 2 WHERE lft > @myRight;

INSERT INTO nested_category(name, lft, rgt) VALUES('GAME CONSOLES', @myRight + 1, @myRight + 2);

我已尝试将上述内容插入到 JPA Native Query 中,如下所示:

Query query = em.createNativeQuery("SELECT @myRight := rgt FROM nested_category
    WHERE name = 'TELEVISIONS';
    UPDATE nested_category SET rgt = rgt + 2 WHERE rgt > @myRight;
    UPDATE nested_category SET lft = lft + 2 WHERE lft > @myRight;
    INSERT INTO nested_category(name, lft, rgt) VALUES('GAME CONSOLES', @myRight + 1, @myRight + 2);");
query.getResultList();

但我得到一个内部异常:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException

有没有办法将上面的查询修改为等效的查询,或者让 Native Query 处理上面的查询?

我尝试了一些嵌套子查询如下:

UPDATE nested_category SET rgt = rgt + 2 WHERE rgt > (SELECT rgt FROM nested_category WHERE name = 'TELEVISIONS');

但是我得到了一个 #1093 - 您不能在 FROM 子句中指定目标表 'nested_category' 进行更新

显然我无法从我选择的表中更新。

【问题讨论】:

    标签: mysql sql jakarta-ee jpa


    【解决方案1】:

    我不知道您是否想在单个查询中解决上述问题,但最简单的方法是拆分为 4 个简单的本机查询。

    Query query = em.createNativeQuery("SELECT rgt FROM nested_category
        WHERE name = 'TELEVISIONS';");
    List<Object> rightSiblings = query.getResultList();
    for (Object sibling : rightSiblings)
                {
                    Integer siblingId = (Integer) sibling;
                    query = em.createNativeQuery("UPDATE nested_category SET rgt = rgt + 2 WHERE rgt >"+siblingId);
                    query.executeUpdate();
                }
    

    然后继续分别处理每个查询。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-17
      • 2019-05-05
      相关资源
      最近更新 更多