hibernate - как сделать условное удаление без загрузки в память - PullRequest
1 голос
/ 07 июля 2011

У меня есть объект -

 @Entity
 public class myObject{
      public MySecondObject objA;
      public MySecondObject objB;
      ...
 }

У меня нет ни одного его экземпляра, но я хочу удалить все строки в БД, которые имеют fieldA == thirdObj У меня есть экземпляр ThirdOBJ, но нет экземпляраmyobjects.это можно сделать с родным sql.но чем мне нужно будет использовать автоматически назначенный идентификатор Thirdobj - для сравнения в БД.
Есть ли более элегантный способ, чем этот?

    try {
        session.beginTransaction();
        session.createQuery("delete from MyObject where fieldA = " +        
                             thirdObject.getID()).executeUpdate();

        session.getTransaction().commit();
        savedSuccessfully = true;
    } catch (HibernateException e) {
        session.getTransaction().rollback();
        savedSuccessfully = false;

    } finally {
        session.close();
    }
    return savedSuccessfully;

Ответы [ 2 ]

3 голосов
/ 07 июля 2011

Должен работать с HQL

session
  .createQuery("delete from MyObject where objA = :third")
  .setEntity("third", thirdObject)
  .executeUpdate();

Но есть некоторые ограничения: удаления HQL не каскадные (большинство) ссылок и не распознают реальный тип при наличии подклассов.Если ваш класс просто класс, он будет работать нормально.

1 голос
/ 07 июля 2011

а) В вашем примере вы используете HQL, а не нативный SQL. Большая разница.
б) Нет, это две возможности. Удалить объект (но сначала его нужно загрузить) или удалить по идентификатору (но это возможно только через HQL или собственный SQL).

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