Hibernate之HQL查询

HQL是完全面向对象的查询语言,因此可以支持继承和多态等特征。
HQL查询依赖于Query类,每个Query实例对应一个查询对象,使用HQL查询按如下步骤进行:

(1)获取Hibernate Session对象;
(2)编写HQL语句;
(3)以HQL语句作为参数,调用Session的createQuery方法创建查询对象;
(4)如果HQL语句包含参数,调用Query的setXxx方法为参数赋值;
(5)调用Query对象的list等方法遍历查询结果。

        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());   
        }   

HQL,Hibernate框架中的查询语言,是一种面向对象查询语言,和sql语句还是非常类似的,就是将sql语句中的表改成实体名,字段改为属性名即可,其它基本都很相似的。主要用的是Query这个对象。返回值可以使用list,iterate(多值),uniqueResult(单值)等属性进行取值。下边看几个小例子:

*1,模糊查询+list迭代:

1.String key = "san";       
2.Query query = session.createQuery("FROM Student s where  s.sname like ?"); //HQL语句。看里边都是使用类名和属性名代替了数据库中的表和字段  
3.query.setParameter(0, "%"+key+"%");  //参数索引从0开始。  
4.//query.setString(0, "%"+key+"%");  
5.List<Student> sts =  query.list();  
6.for(Student s : sts){  
7.    System.out.println(s.getSname());  
8.}  

2,iterate相当于集合中的迭代器,Hibernate框架会先查询符合条件的所有id值,然后根据每个id去查询每一条记录,这样我们查询N条件记录时,框架帮我们发送了N+1条语句,这也就是大家经常讨论的N+1问题。这个我们可以通过实际的例子实验一下:

1.Query query = session.createQuery("from Student s");      
2.      
3.    Iterator<Student> it = query.iterate();  
4.    while(it.hasNext()){  
5.        Student s = (Student)it.next();  
6.        System.out.println(s.getSname());  
7.    }  
        3,返回结果是一个的话,可以使用uniqueResult值来获取:
1.public static void testSelect8(Session session){          
2.    Query query = session.createQuery("from Student s where s.sid=1");        
3.    Student s = (Student)query.uniqueResult();  
4.    System.out.println(s.getSname());  
5.}  

4,当然Query对象也支持update,delete,insert,但是这些操作会立即对数据库的数据进行操作,而不对缓存中的数据进行操作,那么在支持缓存时,数据可能会出现冲突,所以使用要慎用。

1.Query query = session.createQuery("update Student s set s.sname='张三123' where s.sid=1" );         
2.int i = query.executeUpdate();  
3.if(i==1){  
4.    System.out.println("更新成功");  
5.}

参考博客:
http://www.cnblogs.com/focusChen/articles/2401892.html
http://www.cnblogs.com/xiaoluo501395377/p/3376256.html

http://blog.csdn.net/liujiahan629629/article/details/21561265

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值