随笔-61  评论-159  文章-0  trackbacks-0

hibernate查询语言hql

在hql中关键字不区分大小写,但是属性和类名区分大小写

1、简单属性查询
1>如果对单一属性进行查询,返回结果集属性列表,元素类型和实体类中相应的属性类型一致
 

例子:

1List students = session.createQuery("select name from Student").list();
2            for (Iterator iter=students.iterator(); iter.hasNext();) {
3                String name = (String)iter.next();
4                System.out.println("student.name="+name);
5            }

由于第1行中的name是String字符串类型,所以第三行对应的也要是字符串类型。其他的字段也要保持一致。

2>如果是对多个属性进行查询,返回的是Object数组类型,所以其元素类型也要与相对应的属性类型保持一致。

例子:

1List students = session.createQuery("select id,name from Student").list();
2   for (Iterator iter=students.iterator(); iter.hasNext();) {
3    Object[] o = (Object[])iter.next();
4    System.out.println(o[0]+","+o[1]);
5   }


PS:如果想返回的类型与原来的对象类型保持一致的话,就例子而言就是Student类型,首先先包住Student的POJO类中有Student的两个id,name参数的构造方法。

1List students = session.createQuery("select new Student(id,name) from Student").list();
2            for (Iterator iter=students.iterator(); iter.hasNext();) {
3                Student s = (Student)iter.next();
4                System.out.println(s.getId()+","+s.getName());
5            }

注:第一行中的new Student(id,name)很重要,决定返回是Student类型,这样更对象化,其他第3行也一致。

2、实体查询
实体查询中,涉及到对对象的查询,对于多个记录,就一般用Querry接口里面的list()和iterate()方法来迭代。
两种方法的区别是:
                                  一、list(),对条件符合的数据全部一次加载,只发出一条语句。
                                  二、iterate(),先把符合条件的id全部查询出来,然后,再根据里面id数量,发出相应的sql语句,就是有N条记录就查询N+1次。
PS:相对而已,lsit()加载了直接放在一级缓存里面,就是Session里面,从来不使用Session
                            iterate()一开始加载,先从一级缓存里面加载,如果有就只查询一次,如果没有就先把符合条件的id全部查询出来,然后,再根据里面id数量,发出相应的sql语句,就是有N条记录就查询N+1次。
例子:

1List students = session.createQuery("from Student as s").list();
2            for (Iterator iter=students.iterator(); iter.hasNext();) {
3                Student s = (Student)iter.next();
4                System.out.println("student.name="+s.getName());
5            }

注:只发出一条语句。

1Iterator students = session.createQuery("from Student").iterate();
2            while(students.hasNext())
3            {
4                Student s = (Student)students.next();
5                System.out.println("s.name="+s.getName());
6                
7            }

注:发出N+1条语句,因为一级缓存里面没有相应的记录。

 1List students = session.createQuery("from Student").list();
 2                for (Iterator iter=students.iterator(); iter.hasNext();) {
 3                    Student s = (Student)iter.next();
 4                    System.out.println("student.name="+s.getName());
 5                }

 6                System.out.println("---------------------------------------------------");
 7                Iterator it = session.createQuery("from Student").iterate();
 8                while(it.hasNext())
 9                {
10                    Student s = (Student)it.next();
11                    System.out.println("s.name="+s.getName());
12                    
13                }

注:只发出两条查询语句,因为list()已经把数据存在一级缓存里面,对应iterate()先从一级缓存里面查找,所以总共只发出两条查询语句。




-------------------------------------------------------------------------------------------------
PS:本博客文章,如果没有注明是有“转”字样,属于本人原创。如果需要转载,务必注明作者文章的详细出处地址,否则不允许转载,多谢合作!
posted on 2008-10-28 23:56 apple0668 阅读(800) 评论(0)  编辑  收藏 所属分类: hibernate

只有注册用户登录后才能发表评论。


网站导航: