我需要做一个公司地址的搜索-如果一家公司在它的一个地址中有一个特定的字符串,它必须出现在搜索结果中(类似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格式的结果。感谢您的回答!:)
发布于 2011-05-25 20:35:11
您可以尝试:
确保您的Address实体上有Company,并在其映射中引用它,然后将addresses的company实体更改为:
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());然后在您拥有的任何会话中执行该条件。我的问题是,为什么地址映射到公司,而仅仅是一个字符串列表?如果地址是映射到公司的实体,它将为您简化事情。
发布于 2011-05-25 18:47:16
看起来这不能使用Criteria 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>();发布于 2011-05-25 18:46:38
类似于:
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);https://stackoverflow.com/questions/6122982
复制相似问题