使用 hql 语句,要先获取到 Query 对象,hql 语句与 sql 语句的区别是,sql 语句的编写是对表和表中的字段进行操作,hql 语句的编写是对实体类和实体类中的属性进行操作
一:查询全部
from 实体类名
from User
Query query = session.createQuery("from User")
List<User> list = query.list()
二:条件查询
等值查询
from 实体类名 where 实体类属性名=?
from User where uid=?
Query query = session.createQuery("from User where uid=? and uage=?")
使用 query.setParameter() 设置占位符 ?的值,方法有两个参数,第一个参数是给哪一个占位符设置值,第二个参数是值。第一个参数从0开始,第一个?就是0,第二个?就是1
query.setParameter(0,1)
query.setParameter(1,20)
调用方法,执行查询
query.list()
模糊查询
from 实体类名 where 实体类属性名 like ?
from User where username like = ?
Query query = session.createQuery("from User where username like ?")
query.setParameter(0,"%mitu%")
List<User> list = query.list()
三:排序查询
from 实体类名 order by 实体类属性名 asc/desc
Query query = session.createQuery("from User order by uid desc")
List<User> list = query.list()
四:分页查询
hql 语句中,不支持使用 limit 关键字,需要使用 Query 对象的另外两个方法,进行分页的设置。
首先要查询出全部的数据
Query query = session.createQuery("from User")
然后进行分页的设置,设置开始的位置
query.setFirstResult(0)
再进行一页显示的条数
query.setMaxResult(3)
执行查询
List<User> list = query.list()
五:投影查询
投影查询,就是查询某个或某些字段,而不是查询表中的所有字段
select 实体类属性名 from 实体类名
Query query = session.createQuery("select username from User")
List<Object> list = query.list()
六:聚合函数
hql 语句的聚合函数与 sql 相同,区别是 sql 聚合函数中写的是表的字段名,而 hql 中写的是实体类的属性名。hql 语句中的聚合函数,也可以使用 count(*) 去查询符合条件的数据条数。一般使用聚合函数之后,返回的结果都是单一的数值,所以 query 对象提供了返回一个 Object 类型的方法uniqueResult()
查询数量
Query query = session.createQuery("select count(*) from User")
Object count = query.uniqueResult();
查询最大值
Query query = session.createQuery("select Max(userAge) from User")
Object maxAge = query.uniqueResult()
如果返回的结果是 int 类型,可以将 query.uniqueResult()的结果进行toString(),再将 Strng 类型转成 int 类型
int count = Integer.parseInt(query.uniqueResult().toString())