Заставить спящий режим не включать поля из объединенных таблиц в предложении select - PullRequest
5 голосов
/ 10 февраля 2009

Я сталкиваюсь с проблемой производительности в моем SQL с использованием DetachedCriteria Hibernate. У меня есть несколько отношений многие-к-одному, и когда Hibernate генерирует SQL, он включает в себя все поля из таблиц, которые объединены в FROM. Когда это происходит, MySQL требует много времени для выполнения запроса (который также имеет порядок и подзапрос, добавляющий к проблеме). Для моих на данный момент 50к записей ~ 6сек. Когда я удаляю ненужные поля в SELECT только для объекта домена, который меня беспокоит, он работает меньше 500 мс.

Можно ли как-то сказать Hibernate не включать поля из объединений?

Я попытался установить параметр fetch в файлах сопоставления на «join» и «select», и это не имеет значения в сгенерированном SQL.

Я также попытался установить отдельную корневую запись, но из того, что я прочитал, это не работает с подкачкой страниц (что я также делаю).

Я мог бы попытаться написать запрос как HQL, но с подзапросом это только усиливает головную боль.

Ответы [ 3 ]

5 голосов
/ 11 февраля 2009

Вы можете установить проекцию, содержащую список только интересующих вас свойств.

Вот пример из прошлого проекта:

Criteria criteria = getSession().createCriteria(Something.class);
criteria.createCriteria("user", "u");

// only retrieve the following fields: id, state, viewCount, user.username
ProjectionList properties = Projections.projectionList();
properties.add(Projections.property("id"));
properties.add(Projections.property("state"));
properties.add(Projections.property("viewCount"));
properties.add(Projections.property("u.username"));

criteria.setProjection(properties);
1 голос
/ 27 июля 2010

У меня тот же вопрос, это звучит странно, нет способа сделать это. Это звучит как довольно распространенный сценарий, используйте JOIN для фильтрации, но без загрузки всей связанной сущности.

0 голосов
/ 11 февраля 2009

Вы пытались установить Lazy = true для классов, которые вы не хотите загружать?

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