私は 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
これは、1 つのパラメーターのみを渡したい場合にうまく機能します。
ただし、実際に達成したいのは次のとおりです。
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