HQL查询返回的结果绑定到DataGrid的问题

来源:互联网 发布:口红推荐 知乎 编辑:程序博客网 时间:2024/04/25 15:11

采用了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”的字段或属性。

我比较了一下两个绑定到DataGridIListArrayList对象),发现第一种情况没有使用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 SysJobsa.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>

 

 
原创粉丝点击