使用NHibernate进行复杂查询

时间:2010-08-24 17:24:21

标签: nhibernate criteria-api

我有这个问题: 当我尝试实现Ayende的复杂搜索时发现: http://ayende.com/Blog/archive/2006/12/07/ComplexSearchingQueryingWithNHibernate.aspx 使用对象图: 人:            M:1地址:                               M:1街:                                               M:1位置:                                                               M:1 国家 我收到以下错误:NHibernate.QueryException:无法使用 没有投影的标准上的子查询。 我这样做:

public List<Person> Find() 
{ 
    DetachedCriteria query = DetachedCriteria.For<Person>(); 
    AddAddressQuery(query); 
    return personRepository.Find(query);
} 

private void AddAddressQuery(DetachedCriteria query) 
{ 
     DetachedCriteria addressQuery = null; 
     if (!String.IsNullOrEmpty(SearchParams.HouseNumer)) 
     { 
         addresaQuery = DetachedCriteria.For<Address>(); 
         addresaQuery.Add(Restrictions.Eq("HouseNumer", 
SearchParams.HouseNumer)); 
     } 
     this.AddStreetQuery(ref addressQuery); 
     if (addressQuery != null) 
     { 
         query.CreateCriteria("Address1", 
"address1").Add(Subqueries.Exists(addressQuery)); 
     } 
} 

private void AddStreetQuery(ref DetachedCriteria query) 
{ 
    DetachedCriteria streetQuery = null; 
    if (this.SearchParams.StreetId.HasValue) 
    { 
        streetQuery = DetachedCriteria.For<Street>(); 
        streetQuery .Add( Restrictions.Eq("Id", 
this.SearchParams.StreetId.Value)); 
    } 
    if (streetQuery != null) 
    { 
        query = query ?? Query.CreateCriteria("Address1"); 
        query.CreateCriteria("Street", 
"street").Add(Subqueries.Exists(streetQuery )); 
    } 
} 

我做错了什么? 请帮忙

1 个答案:

答案 0 :(得分:9)

就像错误消息一样 - 您需要为任何子查询设置投影。

您的变量addressQuery(DetachedCriteria)用作子查询,但它没有投影。转换为SQL时,查询的相关部分如下所示:

... EXISTS(SELECT FROM Address WHERE HouseNumber = @HouseNumber)

...这是无效的SQL,因为在select子句中没有指定列(a.k.a投影)。

使用SetProjection指定列。