Если много возвращаемых записей из БД. Это вызовет проблему с переполнением стека.
User - это класс, который имеет отношение «один ко многим» (с 3 другими классами). Когда я распечатал SQL, я обнаружил, что система много раз выполняет один и тот же запрос, чтобы получить данные из БД. Кто-нибудь знает, в чем проблема?
result.addAll(getCurrentSession().createCriteria(User.class)
.add(Restrictions.ilike("name", "tom", MatchMode.ANYWHERE))
.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
.list());
сколько именно много? В любом случае, в этом случае вам может быть лучше использовать HQL, а не api критериев. Если ваше предложение where определяется во время выполнения, используется api критериев, в противном случае предпочтительнее HQL. Вы можете зарегистрировать запросы HQL в файлах .hbm или даже с помощью аннотаций, и они компилируются (эффективно проверяются) при первоначальной загрузке привязок.




Если вы ищете пользователей с именем tom только, тогда у него не должно закончиться память, если у вас нет большого количества% tom% hehe.
Вы можете попытаться установить для него ограничение, чтобы он возвращал только те, которые вы можете обрабатывать за раз.
Я не уверен, что кто-то сможет понять, почему он выполняет тот же запрос без дополнительной информации.
Вы случайно не используете EntityMode.DOM4J? (т.е. Hibernate -> XML вместо Hibernate -> POJO). Вложенные отношения не работают без настройки, потому что генератор XML бесконечно рекурсирует там, где POJOS обрабатывает их нормально.
Я могу уточнить, но если вы не используете DOM4J, проблема в другом.
Это поможет точно узнать, какие повторяющиеся запросы вы видите. Как отмечали другие, мы просто размышляем, не видя ваших сопоставлений. Возможно, вы столкнулись с нетерпеливой загрузкой Hibernate. Здесь Hibernate пытается загрузить весь граф объектов для каждого пользователя (и его адреса, телефона, домашних животных и т. д.), Соответствующего общему имени, содержащему запрос «tom». Попробуйте отключить активную выборку по умолчанию для свойств пользователя в файлах сопоставления Hibernate или аннотациях, а затем выполните следующие действия:
Допустим, вы получаете множество повторяющихся запросов, просматривающих таблицы USER_ADDRESS (hibernate property "addresses"), USER_PHONE (property "phones") и USER_PET (property "pets"). Используйте следующие вызовы критериев, чтобы объединить эти атрибуты в исходный запрос и уменьшить количество повторяющихся запросов. Hibernate знает, как разбить эти столбцы на отдельные объекты. Вы также можете попробовать добавить максимальное количество возвращаемых результатов.
Criteria myUsers = getCurrentSession().createCriteria(User.class);
myUsers = myUsers.add(Restrictions.ilike("name", "tom", MatchMode.ANYWHERE));
myUsers.createCriteria("addresses"); // NEW
myUsers.createCriteria("phones"); // NEW
myUsers.createCriteria("pets"); // NEW
myUsers.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
myUsers.setMaxResults(100); // NEW
result.addAll(myUsers.list());
Подробнее читайте в разделах 15.4-15.6 здесь.
stackoverflow в stackoverflow +1