HQL基础

HQL(Hibernate Query Language)是完全面向对象的查询语言,它提供了更加面向对象的封装,可以理解如多态、继承和关联的概念。因为hql是面向对象的查询语言,所以需要从目标对象中查询信息并返回匹配单个实体对象或多个实体对象的集合,而sql语句是从数据库表中查询指定信息,返回的是单条或者多条信息的集合。hql是区分大小写的,sql不区分。因为hql是面向对象的查询语句,他的查询目标是实体对象(也就是java类),而java类是区别大小写的,所以hql也是区分大小写的。Hibernate在3.0版本以后可以使用hql执行update和delete操作(但是并不推荐使用)。
   select * from Table table where table.id=x等价于from Table table where table.id=x,其中table为Table实体对象的别名,在大多数情况下,最好为查询的实体对象指定一个别名,方便在查询语句的其他地方引用实体对象。别名的首字母最好小写。这是hql的规范写法,与java中变量的命名规则是一致的。避免与语句中的实体对象混淆。
   通过from子句查询指定字段数据:select Table(id,...)from Table table这种查询方式将指定的实体对象进行重新封装(我理解为返回的还是一个Table类 只是里面的属性为你要查询的指定字段的属性),既不失去数据的封装性,又可提高查询的效率。而select table.id,table.··· from Table table返回的并不是原有的对象实体状态,而是一个Object类型的数组,他破坏了数据原有的封装性。
   条件查询:from Table table where table.XXX=XXX;条件查询时使用参数绑定机制可以使查询语句和参数具体值相互独立,不但可以提高开发效率,还可以防止sql注入。在jdbc中的preparedstatement对象就是通过动态赋值来对sql参数进行绑定,hql中同样提供了动态赋值的功能,有两种实现方法:
例:1.利用顺序占位符?
           String hql="from Product product where id=?";
          Query query=HibernateUtil.getSession().createQuery(hql);
          query.setParameter(0,4); //查询id为4的产品的数据。从0开始,preparedstatement是从1开始的。
          List list=query.list();
       2.利用引用占位符":parameter",引用占位符是":"和自定义参数名的组合。
          String hql="from Product product where id=:id";
          Query query=HibernateUtil.getSession().createQuery(hql);
          query.setParameter("id",4); //查询id为4的产品的数据。从0开始,preparedstatement是从1开始的。
          List list=query.list();
   排序查询:与sql一样,order by xxx asc 升序排列 order by xxx desc降 序排列
例:from Table table order by table.id asc 按id值进行顺序排列。
   聚合函数:hql中,支持sql中的常用聚合函数,如sum、avg、count、max、min等。使用方法和sql基本相同。
例:select avg(employee.age)  from  Employee employee//查询员工表中的平均年龄。
   分组查询:在hql中,使用group by子句进行分组操作,其使用习惯和sql相同,在hql中同样可以在group by子句中使用haying语句,前提是底层数据库的支持,例如MySQL数据库就不支持having语句。。。
例:select employee.sex,count(*) from Employee employee group by employee.sex //查询男女员工的人数。group by和order by子句都不能含有算术表达式,同时分组条件不能是实体对象,比如group by Employee是不对的。除非实体对象的所有属性都是非聚集的(这句有点不是很懂)。
   联合查询:联合查询是进行1数据库多表操作时必不可少的操作之一,例如sql中熟知的连接查询方式:内联,左联,右联,全联。hql也支持联合查询的方式。
例:select people.id,people.name,people.age,people.sex,card.idcode from People people left join people.idcard card; //通过左联查询公民的信息和相连的身份证号码,其中people.idcard是一个Idcard类 card是Idcard实体类的别名。
   子查询:子查询也是应用比较广泛的查询方式之一。在hql中也支持这种方式,但前提是底层数据库支持子查询。hql中的子查询必须用括号()包起来。
例:from People people where people.age>(select avg(age) from People) //查询年龄比平均年龄大的人的信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值