HQL检索方式

来源:互联网 发布:淘宝手工护肤品良心店 编辑:程序博客网 时间:2024/06/15 05:58

     在使用Hibernate的过程中,发现对数据库的查询语句并不能熟练的掌握,故查阅相关资料,对HQL的检索方式进行的总结。以下是常用方法的总结:

1.1 简介

      HQL(Hibernate Query Language)查询语言是面向对象的查询语句,也是Hibernate中最常用的。其中语法和SQL语法有些相似,功能十分强大,几乎支持除特殊SQL扩展外的所有查询功能。

1.2 HQL的基本语法

      HQL检索方式与SQL相似,使用方法基本相同,但HQL是面向对象语言,其查询的目标为对象,而SQL查询的目标则为数据表;除此之外,在书写HQL语句是要注意,它对大小写是敏感的。基本语法格式如下:

              select “属性名” from “对象” 

              where “条件”

​              group by “属性名” having ”分组条件”

              order by “属性名” deec/asc

      从上述基本语法中可以看出,HQL与SQL的用法基本是一样的,但要注意,在使用HQL时在头脑中一定要有对象的概念。例如:select * from User u where u.id>10 order by u.id desc

     此语句将查询User对象所对应数据表中的记录,条件为id》10,并将返回的结果按id的降序进行排序,语句中User为对象。

1.3  实体对象查询

     在HQL查询语句中,如果直接查询实体对象,不能使用select *子句形式,但可以使用“from 对象”的形式进行查询,例如:from User

    上述HQL语句意味着查询User对象所对应数据表中的所有记录,使用此语句可以获取已封装好的User对象的集合。

1.4  动态实例化对象查询

      在数据查询过程中,当数据表中存在大量字段时,如果通过select *的形式将所有字段都查询出来,将会对性能方面造成一定的影响。在HQL中,可以通过只查询所需要的属性进行查询。例如:Select id,name from User

    上述HQL语句中只查询了User对象中的id与name属性,可以避免查询数据表中的所有字段而带来的性能方面的问题。但在Hibernate中,此语句返回的却是Object类型的数组,它失去了原有的对象状态,破坏了数据的封装性。要解决此问题,可以通过动态实例化对象查询。例如:select new User(id,name) from User

    这种查询方式通过new关键字对实体对象动态实例化,它可以对数据做出封装。例如:

                 session = HibernateUtil.getSession();

                 session.beginTransaction();  //开启事务

                 //HQL语句

                 String hql = "selectnew User(id.name from User)";   

                Query query =session.createQuery(hql);

                list = query.list();     //获取查询结果

                session.getTransaction().commit();  //提交事务    

1.5 条件查询与别名使用

     对于条件查询,在HQL语句中通过where子句来实现。例如: from User where id=1

    上述语句用于实现查询id为1的User对象。

    为了明确区分对象与对象中的属性,HQL提供了以下使用对象别名的方法:

               ①、from User u where u.id = 1

               ②、from User as u where u.id=1

1.6  HQL语句的动态赋值

   1.6.1“?”号代表参数值

           此种方式与PreparedStatement极其相似,通过Query对象的setParamenter()方法进行赋值,在HQL语句中以“?”号代表参数。例如查询id为3的User   

       对 象,可以使用以下方法:

​                //HQL语句

                String hql = " from Useru where u.id = ?"; 

                Query query =session.createQuery(hql);  //创建Query对象

                query = session.setParameter(0,3);  //HQL参数赋值

                list = query.list();     //获取查询结果         

    1.6.2 自定义参数名称

          此种方式通过Query对象的setParamenter()方法进行赋值,但HQL语句中的参数可以自定义,它通过“:”号与自定义参数名组合的方法实现。例如查询id为

      3的User对象,可以使用以下方法:

               //HQL语句

              String hql = " from Useru where u.id =:userId"; 

              Query query =session.createQuery(hql);  //创建Query对象

              query = session.setParameter(“userId”,3);  //HQL参数赋值

              list = query.list();     //获取查询结果         

1.7  对象导航查询

      HQL查询语言符合Java程序员的编程习惯,查询过程都以对象的方式进行操作,当一个对象与另一个对象存在依赖关系是,可以通过“.”符号进行导航。例如:

              session = HibernateUtil.getSession();

              session.beginTransaction();  //开启事务

              //HQL语句

             String hql = "fromMedicine m where m.category.name=?";   

             Query query =session.createQuery(hql);

             query = session.setParameter(0,”感冒药”); //HQL参数赋值

              List list =query.list();     //获取查询结果

              session.getTransaction().commit();  //提交事务

        以上是我认为比较常用的HQL检索方式的部分总结​,这些方法在实际的项目中都尝试过,但在操作过程中只利用HQL进行查询操作,未进行其他操作(update、delete)。

0 0
原创粉丝点击