NHibernate标准问题
我有一个person对象,它可以有无限个名字。所以名字是另一个对象 即 人---姓名NHibernate标准问题,nhibernate,icriteria,Nhibernate,Icriteria,我有一个person对象,它可以有无限个名字。所以名字是另一个对象 即 人---姓名 ---名称 ---名称 我想做的是编写一个nhiberate查询,使用它可以得到一个有特定姓名的人 因此,一个查询可能是查找姓名为alison、jane和philippa的人,然后下一个查询可能是查找姓名为alison和jane的人 我只想返回那些拥有我搜索的所有姓名的人。到目前为止,我已经 ICriteria criteria = session.CreateCriteria(typeof (Person))
---名称
---名称
我想做的是编写一个nhiberate查询,使用它可以得到一个有特定姓名的人 因此,一个查询可能是查找姓名为alison、jane和philippa的人,然后下一个查询可能是查找姓名为alison和jane的人 我只想返回那些拥有我搜索的所有姓名的人。到目前为止,我已经
ICriteria criteria = session.CreateCriteria(typeof (Person));
criteria.CreateAlias("Names", "name");
ICriterion expression = null;
foreach (string name in namesToFind)
{
if (expression == null)
{
expression = Expression.Like("name.Value", "%" + name + "%");
}
else
{
expression = Expression.Or(
expression,
Expression.Like("name.Value", "%" + name + "%"));
}
}
if (expression != null)
criteria.Add(expression);
但这会返回每个人的名字,而不是所有的名字
有人能帮我解决这个问题吗?谢谢 那么它不应该是一个AND表达式吗 像这样:
ICriteria criteria = session.CreateCriteria(typeof (Person));
criteria.CreateAlias("Names", "name");
foreach (string name in namesToFind)
{
criteria.Add(Expression.Like("name.Value", "%" + name + "%"));
}
编辑
嗯。要匹配上面给出的查询,只需稍作更改以避免连接:
ICriteria criteria = s.CreateCriteria(typeof(Person));
foreach (string name in namesToFind)
{
criteria.Add(Subqueries.PropertyIn("Id",
DetachedCriteria.For<Name>()
.Add(Restrictions.Like("Value", name, MatchMode.Anywhere))
.SetProjection(Projections.Property("Person"))));
}
ICriteria标准=s.CreateCriteria(typeof(Person));
foreach(namesToFind中的字符串名称)
{
criteria.Add(subquerys.PropertyIn(“Id”),
DetachedCriteria.For()
.Add(限制,如(“值”、名称、匹配模式、任意位置))
.SetProjection(Projections.Property(“Person”));
}
这要求在Name类上有一个名为Person的映射属性。有多种方法可以实现这一点。可以对每个名称使用exists子查询。或者,您可以在名称上加入,为每个名称添加一个
名称,如“%blah%”
,按个人分组,并添加一个具有count(*)=nameCnt
。但是,ICriteria中不支持Having子句,因此您需要使用HQL。这就是我想要得到的sql类型:
select * from person where Id in
(
select person.id from person inner join [name]
on person.id = name.personId
where name.value like '%jane%'
)
and id in
(
select person.id from person inner join [name]
on person.id = name.personId
where name.value like '%janice%'
)
and id in
(
select person.id from person inner join [name]
on person.id = name.personId
where name.value like '%louise%'
)
那么您将得到sql,其中的名称像“%jane%”和名称像“%philippa%”,这实际上没有意义,是吗?一个名称必须是“philippa jane”或“jane philippa”才能起作用-而不是一个名称“jane”和一个名称“philippa”…好的。我必须学会更仔细地阅读。我已经更新了答案以反映上面的sql。您应该编辑问题,而不是将其添加为答案