C# nHibernate方法,该方法使用用于选择其子集合中字符串包含特定搜索项的父项的条件

C# nHibernate方法,该方法使用用于选择其子集合中字符串包含特定搜索项的父项的条件,c#,nhibernate,criteria,C#,Nhibernate,Criteria,我需要对公司地址进行搜索-如果公司的addrese中有某个字符串,它必须出现在搜索结果中(类似于regex“%string%”) 公司的nHibernate映射文件如下所示: <?xml version="1.0" encoding="utf-8" ?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="TaskMappings"

我需要对公司地址进行搜索-如果公司的addrese中有某个字符串,它必须出现在搜索结果中(类似于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>
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; }
    }
}

公司识别号
公司实体类如下所示:

<?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; }
    }
}
公共类公司:实体
{
公共虚拟字符串名称{get;set;}
公共虚拟字符串Fax{get;set;}
公共虚拟字符串PostalCode{get;set;}
私人IList_phone=新列表();
公共虚拟电话
{
获取{return\u phone;}
设置{u phone=value;}
}
私人IList_email=新列表();
公共虚拟IList电子邮件
{
获取{return\u email;}
设置{u email=value;}
}
私有IList_地址=新列表();
公共虚拟IList地址
{
获取{返回_地址;}
设置{u地址=值;}
}
私有IList用户=新列表();
公共虚拟IList用户
{
获取{返回用户;}
设置{users=value;}
}
}
我的问题是:如何更好地使用条件进行搜索?我需要一个IList的结果。 谢谢你的回答!:)

类似于:

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);
HibernateDelegate del=委托(ISession会话)
{
ICriteria标准=session.CreateCriteria(typeof(ICompany));
标准。创建标准(“公司地址”、“地址”);
标准。添加(限制,如(“地址”);
标准.SetResultTransformer(标准规范.距离);
冬眠标本(标准);
返回条件。List();
};
IList companys=HibernateTemplate.Execute(del);

看起来,使用Criteria API无法做到这一点(尽管我不是100%)。但我已经设法使用HQL查询使其工作

var query = session.CreateQuery("select c from Company c 
join c.Addresses a where a like '%string%'").List<Company>();
var query=session.CreateQuery(“从公司c中选择c
join c.地址一个类似于“%string%”的字符串。List();
您可以尝试:

确保您的地址实体上有一家公司,并在其映射中引用该公司,然后将地址的公司实体更改为:

private IList<Address> _addresses = new List<Address>();
public virtual IList<Address> Addresses
{
    get { return _addresses; }
    set { _addresses = value; }
}
private IList_addresses=new List();
公共虚拟IList地址
{
获取{返回_地址;}
设置{u地址=值;}
}
然后尝试以下标准:

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());
var-criteria=DetachedCriteria.For()
.CreateCriteria(“this.Addresses”、“a”)
.SetFetchMode(“a”,FetchMode.Join)
.Add(限制。不敏感(“a.Address”,MatchMode.Anywhere))
.SetResultTransformer(新的distinctrotentyTransformer());

然后在任何会话中执行该条件。我的问题是,为什么地址映射到公司,而仅仅是字符串列表?如果地址是映射到公司上的实体,则会简化工作。

我收到此错误“错误1找不到类型或命名空间名称“Address”(您是否缺少using指令或程序集引用?)“DetachedCriteria似乎不适用于包。你知道我该怎么做吗?我的错误我的解决方案行不通。我很快会更新我的答案。谢谢你的时间。最后我不得不选择第四个答案,因为它是使用标准完成的。在什么程序集中可以找到HibernateLegate、HibernateTemplate等。?我是nHibernate的初学者,这段代码看起来相当复杂:)@Freeman,对不起,我目前正在使用nHibernate,所以我举了一个nHibernate的例子,这些都是NSpring.Hibernate的一部分。所以我想它不适合你。但是你可以把这些东西拿走。它们只用于使hibernate请求作用于单独的线程。当您的问题afaiu正在创建标准时itself@Freeman. 哦,我今天瞎了。您正在使用NHibernate:)。您可以在Spring.Data.NHibernate.Generic命名空间中找到它。在春天,数据。Nhibernate31@Oleg. 在哪里可以找到Spring.Data.NHibernate.Generic?我只在引用中添加了两个DLL:NHibernate和NHibernate.ByteCode.Castle.@Freeman,如果你不使用Spring(为什么?我想它是如何与NHibernate结合的)。那么就忽略这些(正如我前面所说的)。您已经拥有所需条件的所有代码。如何使用DetachedCriteria返回List()?我知道如何运行它,但它给出了错误:集合附近的非法语法:描述:在执行当前web请求期间发生未处理的异常。请查看堆栈跟踪以了解有关错误的更多信息以及错误在代码中的起源。异常详细信息:NHibernate.QueryException:集合附近的非法语法:a“修改一下,你可以试试那个。我仍然看不出哪些地址像实体一样映射,而只是字符串的集合-这在数据库中是如何结束的?在数据库中,地址位于名为Address的单独表中,表中有3个字段:Id、AddressCompany(外键)和Address(值)。好啊我将尝试一下。修改我的答案以包含您提供的有关地址的新详细信息:)