如何构造一个通过的多条件的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”,字段数组,值数组)来获取符合条件的记录。

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


如果说可以有更好的实现这种功能的办法,也欢迎大家提出来。
...全文
305 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"));
}

HIBERNATE - 符合Java习惯的关系数据库持久化 Hibernate参考文档 3.2 -------------------------------------------------------------------------------- 目录 前言 1. 翻译说明 2. 版权声明 1. Hibernate入门 1.1. 前言 1.2. 第一部分 - 第一个Hibernate应用程序 1.2.1. 第一个class 1.2.2. 映射文件 1.2.3. Hibernate配置 1.2.4. 用Ant构建 1.2.5. 启动和辅助类 1.2.6. 加载并存储对象 1.3. 第二部分 - 关联映射 1.3.1. 映射Person类 1.3.2. 单向Set-based的关联 1.3.3. 使关联工作 1.3.4. 值类型的集合 1.3.5. 双向关联 1.3.6. 使双向连起来 1.4. 第三部分 - EventManager web应用程序 1.4.1. 编写基本的servlet 1.4.2. 处理与渲染 1.4.3. 部署与测试 1.5. 总结 2. 体系结构(Architecture) 2.1. 概况(Overview) 2.2. 实例状态 2.3. JMX整合 2.4. 对JCA的支持 2.5. 上下文相关的(Contextual)Session 3. 配置 3.1. 可编程的配置方式 3.2. 获得SessionFactory 3.3. JDBC连接 3.4. 可选的配置属性 3.4.1. SQL方言 3.4.2. 外连接抓取(Outer Join Fetching) 3.4.3. 二进制流 (Binary Streams) 3.4.4. 二级缓存与查询缓存 3.4.5. 查询语言中的替换 3.4.6. Hibernate的统计(statistics)机制 3.5. 日志 3.6. 实现NamingStrategy 3.7. XML配置文件 3.8. J2EE应用程序服务器的集成 3.8.1. 事务策略配置 3.8.2. JNDI绑定的SessionFactory 3.8.3. 在JTA环境下使用Current Session context (当前session上下文)管理 3.8.4. JMX部署 4. 持久化类(Persistent Classes) 4.1. 一个简单的POJO例子 4.1.1. 实现一个默认的(即无参数的)构造方法(constructor) 4.1.2. 提供一个标识属性(identifier property)(可选) 4.1.3. 使用非final的类 (可选) 4.1.4. 为持久化字段声明访问器(accessors)和是否可变的标志(mutators)(可选) 4.2. 实现继承(Inheritance) 4.3. 实现equals()和hashCode() 4.4. 动态模型(Dynamic models) 4.5. 元组片断映射(Tuplizers) 5. 对象/关系数据库映射基础(Basic O/R Mapping) 5.1. 映射定义(Mapping declaration) 5.1.1. Doctype 5.1.2. hibernate-mapping 5.1.3. class 5.1.4. id 5.1.5. composite-id 5.1.6. 鉴别器(discriminator) 5.1.7. 版本(version)(可选) 5.1.8. timestamp (可选) 5.1.9. property 5.1.10. 多对一(many-to-one) 5.1.11. 一对一 5.1.12. 自然ID(natural-id) 5.1.13. 组件(component), 动态组件(dynamic-component) 5.1.14. properties 5.1.15. 子类(subclass) 5.1.16. 连接的子类(joined-subclass) 5.1.17. 联合子类(union-subclass) 5.1.18. 连接(join) 5.1.19. 键(key) 5.1.20. 字段和规则元素(column and formula elements) 5.1.21. 引用(import) 5.1.22. any 5.2. Hibernate 的类型 5.2.1. 实体(Entities)和值(values) 5.2.2. 基本值类型 5.2.3. 自定义值类型 5

62,046

社区成员

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

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

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

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