Hibernate как преобразовать критерии в HQL?

#hibernate #hql #hibernate-criteria

#спящий режим #hql #спящий режим-критерии

Вопрос:

У меня проблема с запросом критериев.

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

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

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

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

     final Criteria crit = session.createCriteria(ObjectDao.class);
    if (clientName != null amp;amp; clientName.length() > 0) {
        crit.createAlias("objectType.client", "client");
        crit.add(Restrictions.eq("client.name", clientName));
    }
    if (objectType != null amp;amp; 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();
  

Спасибо!

Комментарии:

1. Используете ли вы какой-то кэш 2-го уровня гибернации?

Ответ №1:

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

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

Комментарии:

1. да, запрос работает, но объект все еще находится в сеансе evan, если я использую HQL: (

Ответ №2:

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

 delete from Client where ...
  

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

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

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

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

Комментарии:

1. session.clear();session.flush(); уже выполнены после удаления HQL, но объекты все еще здесь. Я выполнил удаление HQL, чтобы улучшить производительность, которая не очень хороша с критериями для удаления.

2. Вот процессы: 1. Прежде всего, пользователи могут отображать объекты для удаления, поэтому я делал это с критериями, а теперь с запросом HQL 2. Пользователи видят объекты, если он согласен, он может удалять объекты, когда нажимает кнопку «Удалить», если он не согласен, если может ввести новые параметры в форме и нажмите кнопку «Отобразить», чтобы увидеть другие объекты, которые он, возможно, захочет удалить, я изменил критерии удаления на HQL, чтобы улучшить petfs, удаление HQL лучше для удаления многих объектов, но теперь шаг отображения не подходит: (Если после HQL получить я добавляю очистить / закрыть: проблема! : (спасибо