HQL - таблица указывается дважды, как в качестве цели для «УДАЛИТЬ», так и в качестве отдельного источника для данных - PullRequest
0 голосов
/ 17 декабря 2018

Я использую Hibernate 4.3

У меня OneToMany Commande -> Артикул

Я хочу удалить Commande относится к одной статье .Прежде всего, я пытаюсь выбрать нужный список Commande .

        Query querydeleteCmd = em.createQuery("select c from Commande c where (:art) in elements(c.articles)");
        querydeleteCmd.setParameter("art", new Article(1));
        List<Commande> commandes = querydeleteCmd.getResultList();
        commandes.forEach(System.out::println);

Это работает нормально, но когда я хочу удалить (это почти тот же запрос):

        Query querydeleteCmd = em.createQuery("delete from Commande c where (:art) in elements(c.articles)");
        querydeleteCmd.setParameter("art", new Article(1));
        querydeleteCmd.executeUpdate();

Это дает мне:

Причина: java.sql.SQLException: Таблица 'Commande_Article' указывается дважды, как в качестве цели для 'УДАЛИТЬ', так и в качестве отдельного источника для данных

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Исключение говорит:

Таблица 'Commande_Article' указывается дважды, как в качестве цели для 'УДАЛИТЬ', так и в качестве отдельного источника для данных

И этоиз-за того, что вы используете c.articles в качестве источника / набора данных для предложения in из where, это невозможно, поскольку здесь c является одновременно целью операции DELETEи источник данных для предложения in, что приводит к путанице в запросе.

Как вы уже сделали, вам нужно передать коллекцию articles в качестве параметра без ссылки на c в where пункт, чтобы избежать этой проблемы.

0 голосов
/ 19 декабря 2018

Насколько я понимаю: проблема в том, что я не могу указать что-то, что я хочу удалить в предложении "where".

delete from Commande c where (:art) in elements(c.articles)

Так что здесь я не могу использовать "c" в предложении"where"

Это то, что я сделал, и это работает очень хорошо:

1) Я выбираю список Commande для удаления

Query querydeleteCmd = em.createQuery("select c from Commande c where (:art) in elements(c.articles)");
querydeleteCmd.setParameter("art", new Article(1));
List<Commande> commandes = querydeleteCmd.getResultList();

2) ЗатемЯ удаляю весь Commande, используя результат первого запроса:

    Query queryDeleteCommande = em.createQuery("delete from Commande c where c in (:commandes)");
    queryDeleteCommande.setParameter("commandes", commandes);
    int countDeletedCommandes= queryDeleteCommande.executeUpdate();

Возможно, есть лучший способ сделать это за один выстрел.

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