如何解决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);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。