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

stg609 2009-03-06 11:30:18
发现刚发的一篇题目中打错了个字,所以再发一篇,大家可以在两个篇中回答,当然如果回答内容相同,就不重复给分。
上一篇链接:点击

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

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

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


如果说可以有更好的实现这种功能的办法,也欢迎大家提出来。
...全文
437 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
df6692 2010-07-21
  • 打赏
  • 举报
回复
因为只能查询string类型的字段
df6692 2010-07-21
  • 打赏
  • 举报
回复
还是不够通用呀,能不能用条件查询呢?
stg609 2009-03-07
  • 打赏
  • 举报
回复
意思基本是这样。但是在HQL中不能直接像你这样写吧。
我已经写出来了,但是希望还有其他方法~

public List<object> GetEntity(string table, string[] fieldNames, string[] values)
{
List<object> obj = null;
if (fieldNames.Length != values.Length)
{
return null;
}
string query = "From " + table + " as table Where 1=1 ";
for (int index = 0; index < fieldNames.Length; index++)
{
query += " and table." + fieldNames[index] + " =? ";
}
ISession session = SessionFactory.OpenSession(_AssemblyName);
ITransaction transaction = session.BeginTransaction();
IQuery querySession = session.CreateQuery(query);
for (int index = 0; index < fieldNames.Length; index++)
{
querySession.SetString(index, values[index]);
}
obj = (List<object>)querySession.List<object>();
transaction.Commit();
session.Close();
return obj;
}
wts_net 2009-03-06
  • 打赏
  • 举报
回复
帮楼主顶一下
limpid_123 2009-03-06
  • 打赏
  • 举报
回复
mark
yqlx521 2009-03-06
  • 打赏
  • 举报
回复
学习了
shulei521 2009-03-06
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ojlovecd 的回复:]
C# code
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 (colu…
[/Quote]d
qiuming0306 2009-03-06
  • 打赏
  • 举报
回复
public DataTable GetEntity(string TableName, Parameter ss)
{
foreach (object s in ss)
{

//添加参数
}

}
我姓区不姓区 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"));
}


这个意思?

111,098

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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