采用了HQL语言的查询方式,如下是一个简单的查询代码:
IList list = session.CreateQuery("from SysJobs").List(); |
此代码表示的是从SysJobs对象中查询所有的值。
我采用绑定列,设定其字段为相应的SysJobs的属性,把返回结果绑定到DataGrid中,结果显示正常:
<asp:BoundColumn DataField="Name" HeaderText="Job Name"></asp:BoundColumn> |
但是如果我采用下面的HQL语句就出问题了:
IList list = session.CreateQuery("select a.JobId, a.Name, a.Description from SysJobs a").List(); |
在绑定到DataGrid的时候报的错是:选定数据源上未能找到名称为“Name”的字段或属性。
我比较了一下两个绑定到DataGrid的IList(ArrayList对象),发现第一种情况没有使用select的时候每一笔记录存储一个SysJobs对象,因此在绑定的时候抓取此对象的属性是可以找到的,而第二种情况使用了select则每一笔记录存储的是数组对象,所以在绑定到DataGrid时找不到相应的字段或属性。
上面这种情况当然可以只采用第一种形式,不需要用select,但是当我需要从多个对象中抓取数据时就要用到select了,此时就需要解决这个问题了。尝试了两种方法,第一种方法刚开始没解决,后来在别人的帮助下解决了。第二种比较笨的方法虽然解决了,但是一旦改了索引就要对相应的绑定做更改,不易于更新。
1、 在HQL中可以将查询出来的属性组建成一个新的类
用这几个属性组建成一个新的类:
Select new Jobs(a.JobId, a.Name, a.Description) from SysJobs a |
结果依然报错:class not found: Jobs [Select new Jobs(a.JobId, a.Name, a.Description) from BenQ.JobMonitor.SYSEntity.SysJobs a]
查资料发现新的类必须是持久的,必须实现Jobs及其hbm.xml文件映射。
但是可以作如下更改:
Select new SysJobs(a.JobId, a.Name, a.Description) from SysJobs a |
并在SysJobs类中添加new SysJobs(a.JobId, a.Name, a.Description)这个构造方法。
2、 改DataGrid的绑定
把原来的绑定列改为模板列,并且把每个绑定字段都换成对应的数组下标
<asp:BoundColumn DataField="Name" HeaderText="Job Name"></asp:BoundColumn> |
<asp:TemplateColumn HeaderText="Job Name"> <ItemTemplate> <asp:Label runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.Name") %>'> </asp:Label> </ItemTemplate> </asp:TemplateColumn> |
<asp:TemplateColumn HeaderText="Job Name"> <ItemTemplate> <asp:Label runat="server" Text='<%# DataBinder.Eval(Container, "DataItem[1]") %>'> </asp:Label> </ItemTemplate> </asp:TemplateColumn> |