2010-04-12 1 views
0

I'm возникли некоторые проблемы с извлечением набор строк в проекции: сказать, что у меня есть следующие классыПрогнозы NHibernate для извлечения коллекции?

public class WorkSet { 
    public Guid Id { get; set; } 
    public string Title { get; set; } 
    public ISet<string> PartTitles { get; protected set; } 
} 
public class Work { 
    public Guid Id { get; set; } 
    public WorkSet WorkSet { get; set; } 
    //a bunch of other properties 
} 

то у меня есть список рабочих идентификаторов, которые я хочу получить WorkSet.Title, рабочий набор. PartTitles и Id для.

Мой учил должен был сделать что-то вроде этого:

  var works = Session.CreateCriteria<Work>() 
      .Add(Restrictions.In("Id", hitIds)) 
      .CreateAlias("WorkSet", "WorkSet") 
      .SetProjection(
      Projections.ProjectionList() 
       .Add(Projections.Id()) 
       .Add(Projections.Property("WorkSet.Title")) 
       .Add(Projections.Property("WorkSet.PartTitles"))) 
      .List(); 

Идентификатор и Название нагрузки просто отлично, но PartTitles возвращает нуль. Предложения пожалуйста!

+0

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

ответ

1

Это может не сработать с использованием критериев. Скорее всего, это потому, что набор не может быть получен тем же SQL-запросом, который генерируется критериями.

На самом деле я действительно хотел бы получить весь объект. Это намного проще, и если это не очень особый случай, это не стоит проблем. (Кстати, может быть быстрее получить целые объекты, возможно, они уже находятся в кеше.) Обычно считается количество запросов (и его сложность, конечно), а не количество полученных столбцов.

Возможно, он работает с HQL, там есть функция elements. Подумайте, использовать HQL для статических запросов в любом случае, он более мощный.

select 
    ws.Title, 
    elements(ws.PartTitles), 
    w.id 
from 
    Work w 
    inner join w.WorkSet ws 
where w.id in (:ids) 

elements допускается в выбранном пункте, но я не знаю, что вы получите. Вы, скорее всего, получите столько записей, сколько в них получится PartTitles, потому что есть только один SQL-оператор.

+0

Попробуем это с HQL, тогда это очень частный случай, по производительности и классы, о которых идет речь, довольно громоздкие, спасибо! –

 Смежные вопросы

  • Нет связанных вопросов^_^