zoukankan      html  css  js  c++  java
  • 一步步学习NHibernate(8)——HQL查询(2)

    请注明转载地址:http://www.cnblogs.com/arhat

    在上一章中,老魏带着大家学习了HQL语句,发现HQL语句还是非常不错的,尤其是在懒加载的时候,书写起来比较的舒服,但是这里老魏还得再次的说明一定要转换思想,HQL是对对象的查询,所以不应该还想着对表的操作,尤其是where条件中,更是把对对象的查询体现出来了。比如在本章,老魏接着和大家一起来讨论一下HQL语句。

    根据上面的问题,我们来看看下面的查询是如何做的。请查询出位于班级号为1的学生的姓名和班级名称。我们更改一下主程序的代码如下:

    static void Main(string[] args)
    
            {
    
    //定义一个HQL语句
    
    string hql = "select SName,Clazz.CName from Student where Clazz.CId=?";
    
    //创建一个IQuery对象
    
                NHibernate.IQuery query = DAL.NHibernateHelper.GetCurrentSession().CreateQuery(hql);
    
                query.SetParameter(0, 1);
    
    //执行IQuery对象,并把结果取出来
    
    IList<object[]> list = query.List<object[]>();
    
    foreach (object[] objs in list)
    
                {
    
    Console.WriteLine("姓名:" + objs[0] + ",性别:" + objs[1]);
    
                }
    
            }

    我们来分析一下这个HQL语句:

    select SName,Clazz.CName from Student where Clazz.CId=?

    由于Student和Clazz之间的关系,我们在创建Student和Clazz对象的时候,就在Student中创建了一个关联的对象属性Clazz。那么现在我们要查询的是在班级为1中的学生的姓名和班级名称,那么我们应该查询的是Student对象,通过关联属相来指定要查询的字段。并在尤其在where中,通过关联的属性来制定要查询的条件CId。运行一下,看看结果。
    wps_clip_image-26929

    这道题已经把NHibernate中的一些重要的知识点给体验出来了,所以再次强调HQL查询的是对象和对象的属性,所在在HQL中应该写的就是对象和对象的属性。

    好,这是老魏上一章遗留下来的问题,那下面的内容就开始继续讲述HQL中的一些查询,在开始之前我们需要在Student表中插入一个Sage的字段并插入相关数据配合本章的查询。同时需要给Student.cs和Student.hbm.xml文件添加对象的属性。

    wps_clip_image-24805

    1,between ... and

    现在,老魏要查询一下年龄在30到50之间的学生信息。更改一下主程序:

    static void Main(string[] args)
    
            {
    
    //定义一个HQL语句
    
    string hql = "select SName,SAge from Student where SAge between 30 and 50";
    
    //创建一个IQuery对象
    
                NHibernate.IQuery query = DAL.NHibernateHelper.GetCurrentSession().CreateQuery(hql);            
    
    //执行IQuery对象,并把结果取出来
    
    IList<object[]> list = query.List<object[]>();
    
    foreach (object[] objs in list)
    
                {
    
    Console.WriteLine("姓名:" + objs[0] + ",年龄:" + objs[1]);
    
                }
    
            }

    wps_clip_image-9025

    2,order by

    根据上面的结果,对结果进行一个根据年龄的大小从大到小排列数据

    string hql = "select SName,SAge from Student where SAge between 30 and 50 order by SAge desc";

    wps_clip_image-6322

    3,like 模糊查询

    string hql = "select SName,SAge from Student where SName like '%济%'";

    wps_clip_image-6147

    4,in和 not in

    string hql = "select SName,SAge from Student where SAge in (33,25,18)";

    wps_clip_image-31633

    string hql = "select SName,SAge from Student where SAge not in (33,25,18)";

    wps_clip_image-27415

    5,聚合函数,AVG,Sum,Count

    //定义一个HQL语句
    
    string hql = "select avg(SAge) from Student where SAge not in (33,25,18)";
    
    //创建一个IQuery对象
    
                NHibernate.IQuery query = DAL.NHibernateHelper.GetCurrentSession().CreateQuery(hql);            
    
    //执行IQuery对象,并把结果取出来
    
    IList<double> list = query.List<double>();
    
    foreach (double objs in list)
    
                {
    
    Console.WriteLine("学生的平均年龄为:" + objs);
    
                }

    wps_clip_image-20964

    至于SUM,Count这里老魏就不在演示了,大家可以自行测试。

    6,group by 和 having语句

    分别求出每个部门的总人数。

    //定义一个HQL语句
    
    string hql = "select count(*),Clazz.CId from Student group by Clazz.CId";
    
    //创建一个IQuery对象
    
                NHibernate.IQuery query = DAL.NHibernateHelper.GetCurrentSession().CreateQuery(hql);            
    
    //执行IQuery对象,并把结果取出来
    
    IList<Object[]> list = query.List<Object[]>();
    
    foreach (Object[] objs in list)
    
                {
    
    Console.WriteLine("班级:" + objs[1]+",总人数:"+objs[0]);
    
                }

    wps_clip_image-12689

    求出总人数大于2的班级名称。

    string hql = "select count(*),Clazz.CName from Student group by Clazz.CId having count(*) >2";

    wps_clip_image-31171

    本章到这里基本上就差不多把基本的查询讲述完毕了,那么在下一章中,我们主要来阐述一下连接查询和子查询。

  • 相关阅读:
    javaScript对象
    javaScript基础
    使用javaScript和JQuery制作经典面试题:光棒效果
    Animate自定义动画
    使用jQuery快速高效制作网页交互特效
    jQuery中绑定事件bind() on() live() one()的异同
    小笔记1(Get请求)

    this关键字
    Eclipse断点调试(下)
  • 原文地址:https://www.cnblogs.com/arhat/p/3576157.html
Copyright © 2011-2022 走看看