• Hibernate hql查询语法总结
    时间:2009-11-10   作者:佚名   出处:互联网

    HQL(Hibernate Query Language):是面向对象的查询语句,它的语法和SQL语句有些相像,在运行时才得以解析.HQL并不像SQL那样是数据操作语言,它用来取得对象,而不是进行update,delete和insert操作. HQL 是一门对大小写不敏感的的语言,所以SeLect与SELECT和sELeCT是相同的.

    ----------------
    现在有四张表:student,team,course,student_course.

    student 表中有五个字段,分别是:id,name,cardId,age,team_id; 
    team      表中有两个字段,id,teamname;
    course 表中有id,name;
    student_course 表中有stu_id,course_id;      保存多对多的关系表
    ----------------

    Student 是一个对象,student 是数据库中的一个表.

    查询所有的Student对象时,最简单的HQL语句是: from Student,也可以写成 select s from Student (as)s. 注:这的as可以省略

    1:简单的查询遍历对象:

    遍历Student

    Query query=session.createQuery("form Student");       //注: 如果Student对象不是唯一的,那么需要写上包名,如: from test.Student      test为包名.
    List list=query.list();
    for(int i=0;i<list.size();i++)
    {
    Student stu=(Student)list.get(i);
    System.out.println(stu.getName());
    }

    注意: 如果执行HQL语句"from Student,Course",并不时单单返回两个对象,而是返回两个对象的笛卡尔积,这类似SQL语句中字段的全外连接.实际的应用中,"from Student,Course"这种语句几乎是不回出现的.


    2:属性查询:

          ----单个属性查询:

    Query query=session.createQuery("select s.name form Student s");
    List list=query.list();
    for(int i=0;i<list.size();i++)
    {
    String name=(String)list.get(i);
    System.out.println(name);
    }

          ----多个属性查询:

    Query query=session.createQuery("select s.name,s.age form Student s");
    List list=query.list();
    for(int i=0;i<list.size();i++)
    {
    Object obj[]=(Object[])list.get(i);       //取得list中的第i个对象
    System.out.println(obj[0]+"的年龄为: "+obj[1]);
    }


    3:实例化查询:

    实例化查询结果可以说是对属性查询的一重改进.在使用属性查询时由于使用对象数组,操作和理解不太方便,如果将以个Object[]中的成员封装成一个对象就方便多了.

    Query query=session.createQuery("select new Student(s.name,s.age) form Student s");
    List list=query.list();
    for(int i=0;i<list.size();i++)
    {
    Student stu=(Student)list.get(i);
    System.out.println(stu.getName());
    }

    注:运行这个程序的时候,需要一个new Student(s.name,s.age)构造函数.在Student.java中编写这个构造函数.
    public Student(String name,int age)
    {
    this.name=name;
    this.age=age;
    }

    4:查询链接:

    与SQL查询一样,HQL也支持连接查询,如内连接,外连接和交叉连接.支持的链接类型是从ANSI SQL中借鉴来的.
    1: inner jion      (内连接)
    2: left outer join (左外连接)
    3: right outer join(右外连接)
    4: full join(全连接--不常用)

    inner jion 可以简写为join.

    正常情况下必须要建关联。
    select a.id, b.id from A a, B b where a.id = b.id;
    上面每条记录返回的是一个Object[]对象。
    你也可以把结果重新封装一下。
    String hql = "select a.id, b.id from A a, B b where a.id = b.id";
    List result = getHibernateTemplate().find(hql);
    if (result.size() > 0) {
    for (int i = 0; i < result.size(); i++){
    Object[] obj = (Object[]) result.get(i);
    //这里就可以重新封装数据
    }
    }

    5:统计函数查询:

    1: count()       统计记录的条数
    2: min() 求最小值
    3: max() 求最大值
    4: sum() 求和
    5: avg() 求平均值

    //取得Student的数量
    Query query=session.createQuery("select count(*) from Student")

    //avg()取得Student平均年龄
    Query query=session.createQuery("select avg(s.age) from Student as s")

    //upper()方法将字符串转为大写
    Query query=session.createQuery("select upper(s.name) from Student as s")

    //去除重复行distinct
    Query query=session.createQuery("select distinct s.age from Student as s")

    6:子查询:
    all 表示所有记录
    any 便是所有记录中的任意一条
    somy 与any用法一样
    in 等价于any
    exists 表示子查询至少要返回一条数据.
    all:
    from Team t where 22<all(select s.age from Student s)
    from Team t where all(select s.age from      t.student s)>22

    7:修改update()
    Student stu=(Student)session.get(Student.class,"id");      //根据id 得到stu对象
    stu.setName("123");
    session.update(stu);

    8:删除:delete()
    Student stu=(Student)session.get(Student.class,"id");      //根据id 得到stu对象
    session.delete(stu);

    网友留言/评论

    我要留言/评论