Hibernate 之HQL总结

Hibernate 之HQL总结

1. 查询整个映射对象所有字段。

1
2
3
4
5
6
7
8
9
10
11
12
13
    //直接from查询出来的是一个映射对象,即:查询整个映射对象所有字段      
            String hql = "from Users";      
            Query query = session.createQuery(hql);      
                 
            List<Users> users = query.list();      
            for(Users user : users){      
                System.out.println(user.getName() + " : " + user.getPasswd() + " : " + user.getId());      
            }      
         
     输出结果为:      
    name1 : password1 : 1    
    name2 : password2 : 2    
    name3 : password3 : 3

 

2 查询单个字段

1
2
3
4
5
6
7
8
9
10
11
12
    //查询单个字段      
            String hql = " select name from Users";      
            Query query = session.createQuery(hql);      
                 
            List<String> list = query.list();      
            for(String str : list){      
                System.out.println(str);      
            }      
    输出结果为:      
    name1      
    name2      
    name3

3. 查询其中几个字段

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    //查询其中几个字段      
            String hql = " select name,passwd from Users";      
            Query query = session.createQuery(hql);      
            //默认查询出来的list里存放的是一个Object数组      
            List<Object[]> list = query.list();      
            for(Object[] object : list){      
                String name = (String)object[0];      
                String passwd = (String)object[1];      
                     
                System.out.println(name + " : " + passwd);      
            }      
    输出结果为:      
    name1 : password1      
    name2 : password2      
    name3 : password3

4. 修改默认查询结果(query.list())不以Object[]数组形式返回,以List形式返回。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//查询其中几个字段,添加new list(),注意list里的l是小写的。也不需要导入包,这样通过query.list()出来的list里存放的不再是默认的Object数组了,而是List集合了  
        String hql = " select new list(name,passwd) from Users";  
        Query query = session.createQuery(hql);  
        //默认查询出来的list里存放的是一个Object数组,但是在这里list里存放的不再是默认的Object数组了,而是List集合了  
        List<List> list = query.list();  
        for(List user : list){  
            String name = (String)user.get(0);  
            String passwd = (String)user.get(1);  
               
            System.out.println(name + " : " + passwd);  
        }  
        /**  
        输出结果为:  
         name1 : password1  
        name2 : password2  
        name3 : password3  
         */

5.修改默认查询结果(query.list())不以Object[]数组形式返回,以Map形式返回。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    //查询其中几个字段,添加new map(),注意map里的m是小写的。也不需要导入包,这样通过query.list()出来的list里存放的不再是默认的Object数组了,而是map集合了      
            String hql = " select new map(name,passwd) from Users";      
            Query query = session.createQuery(hql);      
            //默认查询出来的list里存放的是一个Object数组,但是在这里list里存放的不再是默认的Object数组了,而是Map集合了      
            List<Map> list = query.list();      
            for(Map user : list){      
                //一条记录里所有的字段值都是map里的一个元素,key是字符串0,1,2,3....,value是字段值    
                //如果将hql改为:String hql = " select new map(name as username,passwd as password) from Users";,那么key将不是字符串0,1,2...了,而是"username","password"了      
                String name = (String)user.get("0");//get("0");是get(key),注意:0,1,2...是字符串,而不是整形      
                String passwd = (String)user.get("1");      
                     
                System.out.println(name + " : " + passwd);      
            }      
            /**    
            输出结果为:    
             name1 : password1    
            name2 : password2    
            name3 : password3    
             */

6.修改默认查询结果(query.list())不以Object[]数组形式返回,以Set形式返回,但是因为Set里是不允许有重复的元素,所以:username和password的值不能相同。只需将hql改为:String hql = ” select new set(name,passwd) from Users”;

7.条件查询

1
2
3
4
5
6
7
8
9
10
11
12
13
/条件查询,参数索引值从0开始,索引位置。通过setString,setParameter设置参数      
            String hql = "from Users where name=? and passwd=?";      
            Query query = session.createQuery(hql);      
            //第1种方式      
    //      query.setString(0, "name1");      
    //      query.setString(1, "password1");      
            //第2种方式      
            query.setParameter(0, "name1",Hibernate.STRING);      
            query.setParameter(1, "password1",Hibernate.STRING);      
            List<Users> list = query.list();      
            for(Users users : list){      
                System.out.println(users.getId());      
            }
1
2
3
4
5
6
7
8
9
10
11
12
13
    //条件查询,自定义索引名(参数名):username,:password.通过setString,setParameter设置参数      
            String hql = "from Users where name=:username and passwd=:password";      
            Query query = session.createQuery(hql);      
            //第1种方式      
    //      query.setString("username", "name1");      
    //      query.setString("password", "password1");      
            //第2种方式,第3个参数确定类型      
            query.setParameter("username", "name1",Hibernate.STRING);      
            query.setParameter("password", "password1",Hibernate.STRING);      
            List<Users> list = query.list();      
            for(Users users : list){      
                System.out.println(users.getId());      
            }

8.聚集函数

HQL查询甚至可以返回作用于属性之上的聚集函数的计算结果:

select avg(cat.weight), sum(cat.weight), max(cat.weight), count(cat)

from Cat cat

受支持的聚集函数如下:

avg(…), sum(…), min(…), max(…)

count(*)

count(…), count(distinct …), count(all…)

关键字distinct与all 也可以使用,它们具有与SQL相同的语义.

select distinct cat.name from Cat cat

select count(distinct cat.name), count(cat) from Cat cat

9.表达式

关键字in与between可按如下方法使用:

from DomesticCat cat where cat.name between ‘A’ and ‘B’

from DomesticCat cat where cat.name in ( ‘Foo’, ‘Bar’, ‘Baz’ )

而且否定的格式也可以如下书写:

from DomesticCat cat where cat.name not between ‘A’ and ‘B’

from DomesticCat cat where cat.name not in ( ‘Foo’, ‘Bar’, ‘Baz’ )

10.order by 子句

查询返回的列表(list)可以按照一个返回的类或组件(components)中的任何属性(property)进行排序:

from DomesticCat cat

order by cat.name asc, cat.weight desc, cat.birthdate

可选的asc或desc关键字指明了按照升序或降序进行排序.

11. group by

一个返回聚集值(aggregate values)的查询可以按照一个返回的类或组件(components)中的任何属性(property)进行分组:

一般和having子句一起使用。

select cat.color, sum(cat.weight), count(cat)

from Cat cat

group by cat.color

having cat.color in (eg.Color.TABBY, eg.Color.BLACK)

 

除非注明,Coder文章均为原创,转载请以链接形式标明本文地址

本文地址:http://www.alonemonkey.com/hibernate-hql.html

本文链接:http://www.alonemonkey.com/hibernate-hql.html