0

私は NHibernate を使用しており、実行したいクエリがあります。これには、テーブル全体に加えてcountandが返されます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
4

2 に答える 2

0

名前付きクエリはシナリオに適していないようです。代わりに、次のようにその場でクエリを作成する必要があります。

    var querybase="select f.Id,Count(f.Id) from foo WHERE {0} group by f.Id";
    var whereClause=new StringBuilder();
    whereClause.Append("0=1 ");
    foreach(var name in names)
    {
       whereClause.Append(string.Format("OR f.Name Like '{0}' ",name));
    }

    var query=string.Format(querybase,whereClasue);

簡単にするために、パラメーターを無視し、名前の値を where 句に追加します。これは、SQL インジェクションの場所を開くため推奨されませんが、ここでパラメーター名を追加して、クエリでパラメーター値を設定できます。

于 2009-09-05T09:50:07.797 に答える
0

元のクエリ

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

nHibernate の場合

SELECT id, COUNT(id) AS myCount FROM
foo INNER JOIN bah ON foo.id = bah.fooId 
WHERE 
foo.Name IN (:names)
GROUP BY fooId

理論的には、あなたのものは次の場合に機能するはずです

1) you set yours up as a Named Query
2) you have an entity setup as the <return class="">
3) you use SetParameterList
4) names is a string array or ArrayList

たとえば、結果のhbmファイル

  <sql-query name="MyFooCount" cacheable="false" read-only="true">
  <return alias="" class="FooCountEntity" />
    <![CDATA[
Your query here...
    ]]>
  </sql-query>

たとえば、C#ファイル

string [] mynames = {"peter", "olivia", "charles"};
query.SetParameterList ("names", mynames);
于 2010-09-07T00:35:39.537 に答える