Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Nhibernate 使用SetParameterList和LIKE关键字_Nhibernate_Group By_Count_Sql Like - Fatal编程技术网

Nhibernate 使用SetParameterList和LIKE关键字

Nhibernate 使用SetParameterList和LIKE关键字,nhibernate,group-by,count,sql-like,Nhibernate,Group By,Count,Sql Like,我使用的是NHibernate,我有一个要运行的查询,它包括返回整个表加上一个count和groupby。从我在网上看到的,你不能用NHibernate标准来做这件事 为了解决这个问题,我使用了一个命名查询: 选择id,将(id)计数为myCount 从富内加入巴 ON foo.id=bah.fooId WHERE foo.Name像:Name 按食物分组 当我只想传入一个参数时,这可以很好地工作 然而,我真正想要实现的是: 选择id,将(id)计数为myCount 来自富 foo.id上的内

我使用的是NHibernate,我有一个要运行的查询,它包括返回整个表加上一个
count
groupby
。从我在网上看到的,你不能用NHibernate标准来做这件事

为了解决这个问题,我使用了一个命名查询:

选择id,将(id)计数为myCount
从富内加入巴
ON foo.id=bah.fooId
WHERE foo.Name像:Name
按食物分组
当我只想传入一个参数时,这可以很好地工作

然而,我真正想要实现的是:

选择id,将(id)计数为myCount
来自富
foo.id上的内部连接bah=bah.fooId
其中foo.Name类似于:name1
或foo.名称如:name2
或foo.名称如:name3
按食物分组
参数的数量是可变的,因此可能有2个或3个或4个名称需要匹配

我使用了一个带有以下代码的标准:

ICriteria criteria=session.CreateCriteria(typeof(Foo)).CreateCriteria(“Bah”);
析取析取=限制。析取();
foreach(Foo-Foo-in-footofid)
{
disjunction.Add(限制,如(“Name”、“%”+Foo.Name+“%”);
}
标准。添加(析取);
结果=criteria.List();
(不过,正如我上面所说:看起来我不能使用它,因为我不能将计数作为返回的一部分返回。)

因此我尝试使用
query.SetParameterList

IQuery=session.GetNamedQuery(“myNamedQuery”);
SetParameterList(“name”,新字符串[]{“eeeny”,“meeny”});
然而,这似乎给了我sql:

选择id,将(id)计数为myCount
来自富
foo.id上的内部连接bah=bah.fooId
哪里有foo.名字像'eeny','meeny'
按食物分组
所以nHibernate不喜欢逗号

将查询更改为

选择id,将(id)计数为myCount
来自富
foo.id上的内部连接bah=bah.fooId
其中foo.Name位于(:Name)
按食物分组
效果很好,但没有给我想要的结果

有人知道我如何使用nHibernate方法来实现这个结果吗

选择id,将(id)计数为myCount
来自富
foo.id上的内部连接bah=bah.fooId
其中foo.Name类似于:name1
或foo.名称如:name2
或foo.名称如:name3
按食物分组

对于您的场景,命名查询似乎不是正确的选择。相反,您应该动态构建查询,如下所示:

    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注入的位置,但您可以在此处添加参数名称,然后在查询中设置参数值。

原始查询

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
  <sql-query name="MyFooCount" cacheable="false" read-only="true">
  <return alias="" class="FooCountEntity" />
    <![CDATA[
Your query here...
    ]]>
  </sql-query>
string [] mynames = {"peter", "olivia", "charles"};
query.SetParameterList ("names", mynames);