#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 получить я добавляю очистить / закрыть: проблема! : (спасибо