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