Hibernate как преобразовать Критерии в HQL? - PullRequest
1 голос
/ 07 октября 2011

У меня проблема с запросом Criteria.

В другом методе я использую HQL-запрос для удаления некоторых объектов в базе данных.Запрос работает.

В другом методе я выполняю запрос Criteria, который получает объекты.Когда я получаю объекты, они не синхронизируются с базой данных.

Итак 1. Как синхронизируется этот критерий запроса в roder, чтобы получить РЕАЛЬНЫЕ объекты?2. Если 1. невозможно, я хочу преобразовать запрос Criteria в HQL

Вот мой запрос критериев:

    final Criteria crit = session.createCriteria(ObjectDao.class);
    if (clientName != null && clientName.length() > 0) {
        crit.createAlias("objectType.client", "client");
        crit.add(Restrictions.eq("client.name", clientName));
    }
    if (objectType != null && objectType.length() > 0) {
        crit.createAlias("objectType", "objectType");
        crit.add(Restrictions.eq("objectType.type", objectType));
    }
    final List<ObjectDao> ret = crit.list();

И преобразованный HQl запрос, который не работает

    String hqlQuery = "select ObjectDao where objectType.client.name = :clientName";
    Query query = session.createQuery(hqlQuery)
    // .setParameter("objectList", objectType)
            .setParameter("clientName", clientName);
    final List<ObjectDao> ret2 = query.list();

Спасибо!

Ответы [ 2 ]

0 голосов
/ 07 октября 2011

Если я правильно понимаю, вы выполняете запрос, такой как

delete from Client where ...

и затем выполните запрос Criteria, который возвращает ObjectDaos, у которого все еще есть клиент, которого вы только что удалили.

Если это так, то это ожидаемое поведение. Запросы в стиле DML (то есть запросы на обновление и удаление) обходят сеанс. Это означает, что если какой-то удаленный вами объект уже был загружен в сеанс до запроса на удаление, Hibernate не удалит их из сеанса и сеанс не будет отражать фактическое состояние базы данных.

Используйте Session.delete для удаления ваших объектов и убедитесь, что ваш граф объектов хранится в памяти.

Или очистить и очистить сеанс после запроса на удаление.

0 голосов
/ 07 октября 2011

Похоже, вы используете кэш 2-го уровня. Если так, то это тоже не сработает.

select o from ObjectDao o where o.objectType.client.name = :clientName
...