2014-01-24 3 views
2

Я пытаюсь реализовать алгоритм вложенных подмножеств для обработки иерархий в реляционной базе данных (MySQL).Вложенные запросы MYSQL в JPA NativeQuery

Конкретно я отслеживаю это превосходное руководство по 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 = 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(); 

Но я получаю Внутренняя Exception: com.mysql.jdbc.exception s.jdbc4.MySQLSyntaxErrorException

Есть ли способ изменить вышеупомянутый запрос в эквивалентном запросе или каким-то образом позволить Native Query обрабатывать вышеуказанный запрос?

Я пробовал некоторый вложенный подзапрос следующий образом:

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

Но я получаю # 1093 - Вы не можете указать целевую таблица «nested_category» для обновления в ЕКЕ

по-видимому, я могу 't обновить из таблицы, из которой я выбираю.

ответ

3

Я не знаю, хотите ли вы решить вышеизложенное в одном запросе, но самым простым способом было бы разделить на 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(); 
      } 

, а затем обрабатывать каждый запрос отдельно.

Смежные вопросы