преобразовать подзапрос в объединение в jpql - PullRequest
2 голосов
/ 05 ноября 2010

У меня есть два класса ClassA и ClassB. Многие ClassB могут иметь связь с одним ClassA, следовательно, отношение многие к одному от ClassB к ClassA Отношения это как:

ClassA {
    @ManyToOne(optional = false)
    @JoinColumn(name = "ClassB_ID", referencedColumnName = "ID", nullable = false)
    private ClassB classB = new ClassB();
}

У меня такой запрос:

delete from ClassA as a 
where a.classB in (select b from ClassB as b where b.attr1=?1 and b.attr2=?2)
and a.attr3=?3

И я преобразовал этот запрос как:

delete from ClassA as a join a.classb as b where b.attr1=?1 and b.attr2=?2
and a.attr3=?3"

Когда я запускаю это, я получаю исключение:

ERROR PARSER    - line 1:28: unexpected token: join

org.springframework.dao.InvalidDataAccessApiUsageException:

узел для перемещения не может быть нулевым !; вложенное исключение java.lang.IllegalArgumentException: узел для перемещения не может быть нулевым!

Кто-нибудь может помочь?

Спасибо.

Ответы [ 2 ]

1 голос
/ 06 ноября 2010

Я бы сказал так: ни один JOIN не может использоваться в массовом запросе. Из официальной документации:

13,4. Операции в стиле DML

Как уже обсуждалось, автоматические и прозрачный объект / реляционное отображение занимается управлением состояние объекта. Состояние объекта доступно в памяти. Это означает, что манипулируя данными непосредственно в база данных (с использованием данных SQL Язык манипулирования (DML) операторы: INSERT, UPDATE, DELETE) не повлияет на состояние в памяти. Тем не менее, Hibernate предоставляет методы для объемного оператора DML в стиле SQL выполнение, которое выполняется через Hibernate Query Language (HQL).

Псевдосинтаксис для ОБНОВЛЕНИЯ и УДАЛИТЬ операторы это: ( UPDATE | DELETE ) FROM? EntityName (WHERE where_conditions)?.

Некоторые моменты, на которые следует обратить внимание:

  • В предложении from ключевое слово FROM необязательно
  • В предложении from может быть только один объект. Оно может, однако, будьте псевдонимом. Если субъект имя псевдоним, то любое свойство ссылки должны быть уточнены с использованием этот псевдоним. Если имя объекта не псевдоним, то это незаконно для любого ссылки на свойства для уточнения.
  • Нет объединений , явных или неявных, можно указывать в объеме HQL-запрос. Подзапросы могут быть использованы в предложение where, где подзапросы сами могут содержать соединения.
  • Предложение where также необязательно.

То, что у вас есть (с использованием подзапроса), является оптимальным, и нет причин для его перезаписи.

Ссылки

1 голос
/ 05 ноября 2010

Вы не можете УДАЛИТЬ из СОЕДИНЕНИЯ.Почему вы хотите переписать оператор DELETE?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...