Play Framework / JPA: поиск с использованием точечной нотации работает, но тот же запрос с использованием удаления не дает - PullRequest
3 голосов
/ 25 ноября 2011

Допустим, у меня есть несколько сущностей, которые выглядят так:

@Entity
public class Person extends Model {
    @ManyToOne
    @JoinColumn(name = "fooId", nullable = false)
    public Foo foo;
    ...
}

@Entity
public class Foo extends Model {
    @ManyToOne
    @JoinColumn(name = "barId", nullable = false)
    public Bar bar;
    ...
}

Теперь, скажем, я хочу найти всех людей, которые не связаны с конкретным экземпляром Bar:

Person.find("foo.bar <> ?", someInstanceOfBar).fetch();

Это работает нормально и возвращает всех людей, которых я ожидал.

Однако, если я слегка подправлю приведенное выше утверждение, удаляю всех людей, не связанных с Bar:

Person.delete("foo.bar <> ?", someInstanceOfBar);

Я получаю следующее:

PersistenceException occured : org.hibernate.exception.SQLGrammarException: could not execute update query
...
Caused by: org.h2.jdbc.JdbcSQLException: Syntax error in SQL statement "DELETE FROM PERSON CROSS[*] JOIN FOO FOO1_ WHERE BARID<>? ";

Любые идеи, почему поиск Людей вернул бы правильное количество строк, но удаление Людей с использованием того же предложения where приведет к исключению?

Ответы [ 2 ]

5 голосов
/ 25 ноября 2011

Проблема в том, что у вас есть оператор Join в операторе удаления. Delete в JPQL принимает только предложения where и уникальную таблицу в качестве цели. Ваше объединение нарушает это условие. См. Документация Oracle по JPQL

.
0 голосов
/ 20 июля 2013
People.delete ("foo IN (?)",
   People.find("foo.bar <> ?", someInstanceOfBar).fetch ()
)

Как это было бы просто и эффективно?

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