NHibernate Query具有针对集合项的标准

时间:2015-11-04 22:25:55

标签: nhibernate

我在数据库中有以下配置。

Database Schema

enter image description here

我希望能够查询他们是员工或供应商的所有个人。在我看到的例子中,我无法使其中任何一个工作。代码不会抛出错误,它不会带回任何记录。

以下是DTO的

string sql = "from Individual i" +
        " inner join fetch i.Companies";
return _session.CreateQuery(sql).List<Individual>();

我有另一个使用这3个表的功能,所有我的个人和公司集合都填充得很好,所以我知道映射正在运行。我只是不知道如何在儿童记录中添加标准。

select i.*
  from individual i inner join individual_company_assoc ica
    on i.individual_sid = ica.individual_sid
 inner join company c
    on ica.company_sid = c.company_sid
 where c.is_vendor = 0

以下是我希望制作的查询。

public IList<Individual> Get(bool vendorsOnly)
{
    try
    {
        return _session.CreateCriteria<Individual>()
            .CreateAlias("Company", "c")
            .Add(Restrictions.Eq("c.IsVendor", vendorsOnly))
            .List<Individual>();
    }
    catch (NHibernate.HibernateException)
    {
        throw;
    }
}

以下是我尝试的内容:

{{1}}

我没有使用FluentNHibernate。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

即使您在查询中引用了连接表的列,nHibernate查询也不会自动与其他表连接。

您必须明确声明查询应与公司表一起加入。

这是一个可行的例子。它使用QueryOver语法,这是Criteria API的类型安全包装。

return _session
           .QueryOver<Individual>()
           .JoinQueryOver<Company>(i => i.Companies>())
           .Where(c => c.IsVendor == vendorsOnly)
           .TransformUsing(NHibernate.Transform.Transformers.DistinctRootEntity)
           .List();