0

我有一个人对象,它可以有无限数量的名字。所以名字是另一个对象。

IE

人---姓名
            ---姓名
            ---姓名

我想做的是编写一个 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);

但这会返回每个人,其中包含我正在搜索的任何名称,而不是所有名称。

谁能帮我解决这个问题?谢谢!

4

3 回答 3

1

那么它不应该是一个 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"))));
    }

这要求您在 Name 类上有一个名为 Person 的映射属性。

于 2010-05-17T09:18:54.517 回答
0

有多种方法可以做到这一点。您可以为每个名称使用存在子查询。或者,您可以加入姓名,name like '%blah%'为每个姓名添加一个,按人分组并添加一个having count(*) = nameCnt. 但是,ICriteria 不支持 Have 子句,因此您需要使用 HQL。

于 2010-05-17T18:42:45.297 回答
0

这是我想要得到的那种 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%'
) 
于 2010-05-17T18:58:13.980 回答