0

無制限の数の名前を持つことができる人物オブジェクトがあります。したがって、名は別のオブジェクトです。

すなわち

人 --- 名前
            --- 名前
            --- 名前

私がやりたいのは、特定の名前を持つ人を取得する nhiberate クエリを作成することです。

したがって、1 つのクエリでアリソン、ジェーン、フィリッパという名前の人を検索し、次のクエリでアリソン、ジェーンという名前の人を検索することができます。

検索対象のすべての名前を持つ人のみを返したいです。これまでのところ、私は持っています

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 + "%"));
    }

編集

Ok。上記のクエリに一致させるには、結合を避けるためにわずかな変更を加えます。

    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

これにはさまざまな方法があります。名前ごとにexistsサブクエリを使用できます。または、名前で結合し、名前name like '%blah%'ごとに を追加し、人ごとにグループ化し、 を追加することもできhaving count(*) = nameCntます。ただし、Having 句は ICriteria ではサポートされていないため、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 に答える