首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >nHibernate方法,使用选择父项的条件,其子集合中的字符串包含特定的搜索词

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

Stack Overflow用户
提问于 2011-05-25 18:27:20
回答 3查看 2K关注 0票数 1

我需要做一个公司地址的搜索-如果一家公司在它的一个地址中有一个特定的字符串,它必须出现在搜索结果中(类似regex '% string %‘)。

公司的nHibernate映射文件如下所示:

代码语言:javascript
复制
<?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实体类,如下所示:

代码语言:javascript
复制
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格式的结果。感谢您的回答!:)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-05-25 20:35:11

您可以尝试:

确保您的Address实体上有Company,并在其映射中引用它,然后将addresses的company实体更改为:

代码语言:javascript
复制
private IList<Address> _addresses = new List<Address>();
public virtual IList<Address> Addresses
{
    get { return _addresses; }
    set { _addresses = value; }
}

然后尝试以下条件:

代码语言:javascript
复制
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());

然后在您拥有的任何会话中执行该条件。我的问题是,为什么地址映射到公司,而仅仅是一个字符串列表?如果地址是映射到公司的实体,它将为您简化事情。

票数 1
EN

Stack Overflow用户

发布于 2011-05-25 18:47:16

看起来这不能使用Criteria API (尽管我不是100%) see here for another similar question来完成。但我已经设法使用HQL查询使其正常工作。

代码语言:javascript
复制
var query = session.CreateQuery("select c from Company c 
join c.Addresses a where a like '%string%'").List<Company>();
票数 1
EN

Stack Overflow用户

发布于 2011-05-25 18:46:38

类似于:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6122982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档