现在的位置: 首页 > 综合 > 正文

终于解决了NHibernate的排序问题

2018年03月19日 ⁄ 综合 ⁄ 共 827字 ⁄ 字号 评论关闭

首先说另一个问题,就是前面那篇文章上说的在Groups表中只调入ParentID为空的那些顶级组对象的方法:
???ICriterion ex=Expression.IsNull("ParentGroup");
???Order o=Order.Asc("GroupID");
???IList li=session.CreateCriteria(typeof(Group)).Add(ex).AddOrder(o).List();


一句话定义一个条件,括号里面的是Group类里面该条件所对应的字段,而不是数据库里的真正字段名,第二句话定义一个排序,(这个只是提取这个顶级组的
时候的排序),第三句话使用session的这个方法加载对象,它的后面可以跟多个条件。这样加载进来的List就是包含了所有顶级组的对象的列表,而且
是排序的。但是这样并不能保证每个对象里的ChildGroups和Items里面所包含的子类也是排序的。

解决办法是,在类定义中直接使
用IList类来定义这两个序列对象,而不是使用Iesi库里面的ISet。同时,在hbm配置文件里也不能使用set来定义one-to-many,要
使用bag,这就是我一开始使用IList总是失败提示无法正确转换对象的原因所在。bag段允许一个特别定义:Order By。
????? <bag name="ChildGroups" inverse="true" table="Groups" cascade="all" order-by="GroupID asc">


过这样的设置,在调入某个组所对应的下级组的时候,生成的SQL语句就会加上Order by
GroupID,调入的对象也就是排序的了。(我还不知道bag后面加的这个是类里面字段的名字还是数据库里面字段的名字,应该是类里的名字,这个很容易
试出来。因为我定义的两个字段的名字是相同的,所以暂时懒的去管它了)。

解决了这个问题,终于可以开始用NHibernate开发实用的程序了。

抱歉!评论已关闭.