如何构造一个通过的多条件的HQL查询方法呀?

stg609 2009-03-06 11:25:55
最近在用Nhibernate,遇到一个小问题。
在我的DAL层中有一个EntityControl.cs,里面封装一些执行NHibernate的通用方法,如AddEntity,DeleteEntity等。这样在具体的DAL类中就只需要调用这些通用的方法就可以实现数据的交互。而不需要知道具体Nhibernate是如何操作的,同时也省去了很多重复的代码。但是在该通用方法中有一些查询方法,每个查询方法只能根据特定的数量的字段和值查询条件进行查询,也就是说如果我的查询条件只有一个,那我这个查询方法中就只需要有一个字段参数,如果有两个就需要两个字段参数,如果有三个就需要三个字段参数,依此类推。这样的话,我就很难确定到底写几个查询方法才能满足调用的需要。万一有100种可能的情况,那我不是就要为1个字段参数到100个字段参数写100个查询方法了?

因此我想写一个通用的多条件HQL查询的方法,可是不知道该怎么写。请大家帮忙。
现在有一个想法是利用数组。如GetEntity(表名,字段名[],值[])。
这样可以假设现在需要从表1中查询 字段1="1" 并且 字段2="2" 的值,那我首先可以构造两个string数组,其中一个存放多个字段,另一个存放对应的值。
接着调用GetEntity(“表1”,字段数组,值数组)来获取符合条件的记录。

不知道这个方法具体该如何实现,请大家出些主意,最好能有实现代码。谢谢。


如果说可以有更好的实现这种功能的办法,也欢迎大家提出来。
...全文
306 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
stg609 2009-03-10
  • 打赏
  • 举报
回复
虽然没有得到我要的答案,但是还是谢谢大家的回答。
wangtianleiw 2009-03-06
  • 打赏
  • 举报
回复
不会
马老虎 2009-03-06
  • 打赏
  • 举报
回复
up!
stg609 2009-03-06
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 camelials 的回复:]
....

我在用ORM的应用时候,对于查询,往往我会增加一个@ShowType的参数.
然后查询参数,往往事先都考虑到可能涉及的字段.
这样下来通常的查询方法,就一个.

对应的Database procedure 里自己
if(@ShowType = ??)
else if(@ShowType = ??)
就处理了...
[/Quote]

谢谢你的回答,不过没看明白~~希望能再详细说一下你的方法。@ShowType的参数是做什么用的?
Roc_Lee 2009-03-06
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 camelials 的回复:]
Nhibernate是ORM思想的一种实现.主要就是实体类和数据库字段映射对应.
这就决定了,在查询需要根据实际的应用中一定会出现多个查询方法.
一般来说,对于同一张表,查询方法也不会很多.如果有真的很多,你就应该重新思考,你的表结构是否真的合理了.

我在用ORM的应用时候,对于查询,往往我会增加一个@ShowType的参数.
然后查询参数,往往事先都考虑到可能涉及的字段.
这样下来通常的查询方法,就一个.

对应的Database pro…
[/Quote]
支持3楼。我也通常这么做,比较简单
stg609 2009-03-06
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 fancystyle 的回复:]
你的表也不会有100个where条件
我在用NH时多条件,也是多写几个方法.也没有几个.
我想这个没有什么好的方法.1=1之类的方法也比较丑陋.
[/Quote]
一般来说就像你说的是不会出现这么多条件的,但是如果能有一个通用的,可以实现封装变化的效果,那不是更好。
BossFriday 2009-03-06
  • 打赏
  • 举报
回复
Nhibernate是ORM思想的一种实现.主要就是实体类和数据库字段映射对应.
这就决定了,在查询需要根据实际的应用中一定会出现多个查询方法.
一般来说,对于同一张表,查询方法也不会很多.如果有真的很多,你就应该重新思考,你的表结构是否真的合理了.

我在用ORM的应用时候,对于查询,往往我会增加一个@ShowType的参数.
然后查询参数,往往事先都考虑到可能涉及的字段.
这样下来通常的查询方法,就一个.

对应的Database procedure 里自己
if(@ShowType = ??)
else if(@ShowType = ??)
就处理了...
Andy__Huang 2009-03-06
  • 打赏
  • 举报
回复
这个方法可以,但要用ref传输数据地址;
fancystyle 2009-03-06
  • 打赏
  • 举报
回复
你的表也不会有100个where条件
我在用NH时多条件,也是多写几个方法.也没有几个.
我想这个没有什么好的方法.1=1之类的方法也比较丑陋.
我姓区不姓区 2009-03-06
  • 打赏
  • 举报
回复

static void Main(string[] args)
{
Console.WriteLine(GetEntity("table1", new string[] { "column1", "column2" }, new string[] { "value1", "value2" }));
}

static string GetEntity(string tableName, string[] columns, string[] values)
{
if (columns.Length != values.Length)
return "";
if (columns == null || values == null || columns.Length == 0)
return "select * from " + tableName;
StringBuilder sb = new StringBuilder();
for (int i = 0; i < columns.Length; i++)
sb.Append(columns[i] + "='" + values[i] + "' and ");
return "select * from " + tableName + " where " + sb.ToString().Substring(0, sb.ToString().LastIndexOf("and"));
}

62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧