2011-05-25 30 views
1

我需要搜索公司地址 - 如果公司在其中一個擴展名中包含特定字符串,它必須出現在搜索結果中(類似於正則表達式'%string%')。nHibernate方法使用Criteria選擇其子集合中的字符串包含特定搜索詞的父代

本公司NHibernate的映射文件是這樣的:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
        assembly="TaskMappings" 
        namespace="TaskMappings"> 
    <class name="Company"> 
     <id name="Id"> 
      <generator class="sequence"> 
       <param name="sequence">company_id_seq</param> 
      </generator> 
     </id> 
     <property name="Name" /> 
     <property name="Fax" /> 
     <property name="PostalCode" /> 

     <bag name="Users" cascade="all-delete-orphan" inverse="true"> 
      <key column="UserCompany" /> 
      <one-to-many class="User" /> 
     </bag> 

     <bag name="Phone" cascade="all-delete-orphan" lazy="false"> 
      <key column="PhoneCompany" /> 
      <element column="Phone" /> 
     </bag> 

     <bag name="Email" cascade="all-delete-orphan" lazy="false"> 
      <key column="EmailCompany" /> 
      <element column="Email" /> 
     </bag> 

     <bag name="Addresses" table="address" cascade="all-delete-orphan" lazy="false"> 
      <key column="AddressCompany" /> 
      <element column="Address" type="String"/> 
     </bag> 
    </class> 
</hibernate-mapping> 

和公司實體類是這樣的:

public class Company : Entity<int> 
{ 
    public virtual string Name { get; set; } 
    public virtual string Fax { get; set; } 
    public virtual string PostalCode { get; set; } 

    private IList<string> _phone = new List<string>(); 
    public virtual IList<string> Phone 
    { 
     get { return _phone; } 
     set { _phone = value; } 
    } 

    private IList<string> _email = new List<string>(); 
    public virtual IList<string> Email 
    { 
     get { return _email; } 
     set { _email = value; } 
    } 

    private IList<string> _addresses = new List<string>(); 
    public virtual IList<string> Addresses 
    { 
     get { return _addresses; } 
     set { _addresses = value; } 
    } 

    private IList<User> users = new List<User>(); 
    public virtual IList<User> Users 
    { 
     get { return users; } 
     set { users = value; } 
    } 
} 

我的問題是:我該怎麼辦使用條件最好的搜索?我需要一個IList的結果。 感謝您的回答! :)

回答

1

你可以嘗試:

確保您的地址實體有一個公司它,並在它的映射引用它,然後改變你的公司實體地址:

private IList<Address> _addresses = new List<Address>(); 
public virtual IList<Address> Addresses 
{ 
    get { return _addresses; } 
    set { _addresses = value; } 
} 

,然後試試這個條件:

var criteria = DetachedCriteria.For<Company>() 
    .CreateCriteria("this.Addresses", "a") 
    .SetFetchMode("a", FetchMode.Join) 
    .Add(Restrictions.InsensitiveLike("a.Address", <string variable>, MatchMode.Anywhere)) 
    .SetResultTransformer(new DistinctRootEntityTransformer()); 

然後在任何會話中執行該標準。我的問題是,爲什麼地址映射到公司,但只是一個字符串列表?如果地址是映射到公司的實體,它將簡化您的工作。

+0

我如何使用DetachedCriteria獲取列表()返回? – 2011-05-25 12:44:22

+0

我想出瞭如何運行它,但它給出了錯誤:「非法語法靠近集合:a 描述:執行當前Web請求期間發生未處理的異常。請查看堆棧跟蹤以獲取有關該錯誤的更多信息以及源代碼的位置。 異常詳細信息:NHibernate.QueryException:收集附近的非法語法:「 – 2011-05-25 12:53:04

+0

修改了它,你可以嘗試一個。我仍然沒有看到像一個實體映射的地址是什麼,但只是一個字符串集合 - 這是怎麼回事你的數據庫? – Fourth 2011-05-25 13:01:03

0

喜歡的東西:

HibernateDelegate<IList<IAssetLiabilityModel>> del = delegate(ISession session) 
    { 
     ICriteria criteria = session.CreateCriteria(typeof(ICompany)); 
     criteria.CreateCriteria("Company.Addresses", "Addresses"); 
     criteria.Add(Restrictions.Like("Addresses",<your_search_string>)); 
     criteria.SetResultTransformer(CriteriaSpecification.DistinctRootEntity); 
     HibernateTemplate.PrepareCriteria(criteria); 
     return criteria.List<ICompany>(); 
    }; 
    IList<ICompany> companies = HibernateTemplate.Execute(del); 
+0

在什麼程序集中我可以找到HibernateDelegate,HibernateTemplate等?我是nHibernate的初學者,這段代碼看起來相當複雜:) – 2011-05-25 11:19:38

+0

@Freeman,對不起,我正在使用NHibernate,所以我給了NHibernate的一個例子,這些東西都是NSpring.Hibernate的一部分。所以我想這不適合你。但你可以刪除這些東西。它們僅用於使hibernate請求在單獨的線程上運行。雖然你的問題afaiu自己創建標準 – Oleg 2011-05-25 12:06:33

+0

@Freeman。哦,我今天失明瞭。你正在使用NHibernate :)。你會在Spring.Data.NHibernate.Generic命名空間中找到它。在Spring.Data.Nhibernate31 – Oleg 2011-05-25 12:11:21

1

看起來這無法使用標準的API來完成(雖然我不是100%)see here for another similar question。但我已經設法使用HQL查詢來使其工作。

var query = session.CreateQuery("select c from Company c 
join c.Addresses a where a like '%string%'").List<Company>(); 
+0

我得到這個錯誤「錯誤1無法找到類型或命名空間名稱」地址「(您是否缺少using指令或程序集引用?)「看起來像DetachedCriteria不能使用一個包,任何想法我怎麼能使它工作? – 2011-05-25 11:05:29

+0

我的錯誤我的解決方案將無法正常工作,我會盡快更新我的答案 – 2011-05-25 11:36:21

+0

感謝您的時間。選擇第四個答案的原因是它使用Criteria完成 – 2011-05-25 15:12:51

相關問題