установить lazy как true во время выполнения HQL - PullRequest
1 голос
/ 15 мая 2009

В нашем приложении у нас есть различные объекты, для которых установлено значение lazy false в зависимости от потребностей приложения. Однако в одном из вариантов использования мы хотим игнорировать все ленивые настройки в файлах HBM и получать ТОЛЬКО целевой объект.

Таким образом, вопрос заключается в следующем: есть ли способ указать в HQL выборку ТОЛЬКО целевого объекта независимо от настроек HBM?

~ Sri

Ответы [ 2 ]

1 голос
/ 15 мая 2009

вы можете использовать setFetchMode в Критериях перед его выполнением для переопределения настройки файла HBM

0 голосов
/ 15 мая 2009

Извините, не уверен, что вы поняли свой вопрос.

Если вам нужно реализовать его для определенного класса, вы можете просто использовать SetFetchMode.

var query = session.CreateCriteria(typeof(MyClass));
query.SetFetchMode("PropertyA", FetchMode.Select);
query.SetFetchMode("PropertyB", FetchMode.Select);

Примечание: для ссылок «многие-к-одному» сам класс сущности должен отображаться с помощью lazy = true. Если нет, NHibernate даже не создает прокси-класс для него.


Это ответ, если вы хотите лениво загрузить тип универсальным, независимым от типа способом:

Вы можете найти их с метаданными и добавить режимы выборки к критерию

Я не пробовал, но я бы начал со следующего кода:

var meta = sessionfactory.GetClassMetaData(typeof(MyClass));

var query = session.CreateCriteria(typeof(MyClass));

for(int index = 0; index < meta.PropertyType.Length; index++)
{
  if (meta.PropertyType[index] == NHibernateUtil.Entity)
  {
    query.SetFetchMode(meta.PropertyNames[index], FetchMode.Select);
  }
}

Сюда не входят коллекции. Они, вероятно, найдены с factory.GetCollectionMetadata(roleName), но вам нужно выяснить roleName.

...