我正在使用 NHibernate 并且我有一个要运行的查询,其中涉及返回整个表加上一个count
and group by
。根据我在网上阅读的内容,您无法使用 NHibernate Criteria 执行此操作。
为了解决这个问题,我使用了一个命名查询:
SELECT id, COUNT(id) AS myCount
FROM foo INNER JOIN bah
ON foo.id = bah.fooId
WHERE foo.Name LIKE :name
GROUP BY fooId
当我只想传入一个参数时,这很好用。
不过,我真正想要实现的是:
SELECT id, COUNT(id) AS myCount
FROM foo
INNER JOIN bah ON foo.id = bah.fooId
WHERE foo.Name LIKE :name1
OR foo.Name LIKE :name2
OR foo.Name LIKE :name3
GROUP BY fooId
参数的数量是可变的,因此我想要匹配的名称可能有 2 个或 3 个或 4 个。
我使用带有以下代码的标准解决了它:
ICriteria criteria = session.CreateCriteria(typeof (Foo)).CreateCriteria("Bah");
Disjunction disjunction = Restrictions.Disjunction();
foreach (Foo foo in fooToFind)
{
disjunction.Add(Restrictions.Like("Name", "%" + Foo.Name + "%"));
}
criteria.Add(disjunction);
result = criteria.List<Foo>();
(就像我上面说的:看起来我不能使用它,因为我不能将计数作为回报的一部分返回。)
所以我尝试使用query.SetParameterList
:
IQuery query = session.GetNamedQuery("myNamedQuery");
query.SetParameterList("name", new string[] {"eeeny", "meeny"});
然而,这似乎给了我 sql:
SELECT id, COUNT(id) AS myCount
FROM foo
INNER JOIN bah ON foo.id = bah.fooId
WHERE foo.Name LIKE 'eeny','meeny'
GROUP BY food
所以 nHibernate 不喜欢逗号。
将查询更改为
SELECT id, COUNT(id) AS myCount
FROM foo
INNER JOIN bah ON foo.id = bah.fooId
WHERE foo.Name IN (:name)
GROUP BY fooId
效果很好,但没有给我想要的结果。
有谁知道我怎样才能达到这个结果 - 使用任何 nHibernate 方法?
SELECT id, COUNT(id) AS myCount
FROM foo
INNER JOIN bah ON foo.id = bah.fooId
WHERE foo.Name LIKE :name1
OR foo.Name LIKE :name2
OR foo.Name LIKE :name3
GROUP BY fooId