nHibernate方法,使用条件来选择其子级集合中的字符串包含某个搜索词的父母

| 我需要在公司地址上进行搜索-如果公司的地址中有一个特定的字符串,则它必须出现在搜索结果中(例如regex \'%string%\'之类的东西)。 公司的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>
和Company实体类如下:
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。 感谢您的回答! :)     
已邀请:
您可以尝试: 确保您的地址实体上有公司,并在其映射中引用它,然后将公司实体的地址更改为:
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());
然后只要在任何会话中执行该条件即可。我的问题是,为什么地址映射到Company,而只是一个字符串列表?如果地址是映射到公司的实体,则将为您简化事情。     
看起来这无法使用Criteria API进行(尽管我不是100%),请参见此处,了解另一个类似的问题。但是我设法使用HQL查询使其工作。
var query = session.CreateQuery(\"select c from Company c 
join c.Addresses a where a like \'%string%\'\").List<Company>();
    
就像是:
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);
    

要回复问题请先登录注册