2010-11-10 94 views
0

我在我的web应用程序中使用NHibernate,它与我的数据库映射。我有一个模型,财产以后这样的:NHibernate中的自定义填充集合

public class Company { 
    public virtual string Name { get; set; } 
    public virtual IList<Employee> Employeers { get; set; } 
} 

public class Employee { 
    public virtual string Name { get; set; } 
    public virtual DateTime Birthday { get; set; } 
    /* other properties */ 
    public virtual Company Company { get; set; } 
} 

PS:这不是真正的模式,但它适合我的样品/疑虑......

我使用HQL让我的对象,我会想知道是否有任何方法可以:

1)获得一个公司对象,并填补雇主收入排名前10名雇员按生日Desc?

2)有没有什么办法,当收集填充,填写只有像名称和生日一些领域?我有很多属性,我不会在我看来使用。我可以为此创建一个DTO,但我不知道该怎么做!

谢谢

回答

2

持久性集合和实体表示当前状态;他们不能只有一部分(想一想:如果他们这样做,NH如何跟踪变化?)

因此,在这两种情况下,答案都是查询和DTO。您可以使用HQL轻松检索您需要的数据:

class EmployeeNameAndBirthDay 
{ 
    public string Name { get; set; } 
    public DateTime Birthday { get; set; } 
} 

public IList<EmployeeNameAndBirthDay> GetTopEmployees(Company company) 
{ 
    return session.CreateQuery(@" 
        select Name as Name, 
          Birthday as Birthday 
        from Employee 
        where Company = :company 
        order by Birthday desc 
        ") 
        .SetParameter("company", company) 
        .SetMaxResults(10) 
        .SetResultTransformer(
         Transformers.AliasToBean<EmployeeNameAndBirthDay>()) 
        .List<EmployeeNameAndBirthDay>(); 
} 
+0

嗨迭戈,感谢awser。那么,它会正常工作,我想像这样的事情。我会做的。但我很好奇,有没有办法与公司进行相同的hql查询?未来是一个不错的选择?我正在使用NH 2.1 – 2010-11-10 13:26:38

+0

您已经拥有该公司,您需要什么?之后将其添加到DTO中。无论如何,如果你真的想这样做,只需在选择列表和DTO中添加“Company”。 – 2010-11-10 13:29:10

+0

我明白了!感谢Diego ... – 2010-11-10 13:31:31