HQL:hibernate query language
涉及的对象:Query接口
如何获取该对象:Query query = session.createQuery(String hql);
方法中参数的含义:使用HQL语句查询数据库
SQL:select cust_id from cst_customer(此处是表名与字段名)
HQL:select custId from Customer(此处是类名与属性名)
HQL语句,把sql语句的表名换成类名,把字段名换成实体类中的属性名
接收查询结果方法
query.list():返回hql查询语句的集合
query.uniqueResult():返回hql查询语句的唯一结果对象
list()方法与iterator()方法区别
list方法会第一时间查出完整的数据结果;
iterator方法第一时间只查出id,当要用某对象的时候,会根据id去查数据,可以与二级缓存配合(直接用id去缓存中找对象)。
基本查询
public void baseQuery() {
Session session = HibernateUtils.getCurrentSession();
session.getTransaction().begin();
Query query = session.createQuery("from Goods");// 此处是类名
List list = query.list();
for (Object object : list) {
System.out.println(object);
}
session.getTransaction().commit();
}
条件查询
使用 "?" 参数占位符的方式,hibernate参数占位符是从0开始
public void criteriaQuery() {
Session session = HibernateUtils.getCurrentSession();
session.getTransaction().begin();
Query query = session.createQuery("from Goods where goodsName = ?");
query.setString(0, "苹果");
List list = query.list();
for (Object object : list) {
System.out.println(object);
}
session.getTransaction().commit();
}
使用 ":参数别名" 为参数起别名的方式,参数别名可以任意写
public void criteriaQuery() {
Session session = HibernateUtils.getCurrentSession();
session.getTransaction().begin();
Query query = session.createQuery("from Goods where goodsName = :name");
query.setParameter("name", "苹果");// setParameter可以传object类型,比setString好用
List list = query.list();
for (Object object : list) {
System.out.println(object);
}
session.getTransaction().commit();
}
排序查询
order by,默认升序asc,降序desc
public void orderByQuery() {
Session session = HibernateUtils.getCurrentSession();
session.getTransaction().begin();
Query query = session.createQuery("from Goods order by goodsPrice desc");
List list = query.list();
for (Object object : list) {
System.out.println(object);
}
session.getTransaction().commit();
}
分页查询
query.setFirstResult(int i);设置查询开始记录的索引
query.setMaxResults(int i);设置每次查询的条数
不管用什么数据库,涉及分页都是这两个方法,因为SQL语句的生成是Hibernate的事
public void limitQuery() {
Session session = HibernateUtils.getCurrentSession();
session.getTransaction().begin();
Query query = session.createQuery("from Goods");
query.setFirstResult(0);
query.setMaxResults(2);
List list = query.list();
for (Object object : list) {
System.out.println(object);
}
session.getTransaction().commit();
}
统计查询
在HQL中使用聚合函数:count、sum、avg、max、min
public void countQuery() {
Session session = HibernateUtils.getCurrentSession();
session.getTransaction().begin();
Query query = session.createQuery("select count(*) from Goods");
Long count = (Long) query.uniqueResult();// 当返回结果唯一时,可以使用此方法;如果返回的结果不唯一,使用了此方法会抛异常。
System.out.println(count);
session.getTransaction().commit();
}
投影查询
当我们在查询实体时,只需要部分字段,而不是全部,并且希望它的返回结果使用实体类来封装,而不是Object[],这个时候我们称之为创建实体类的投影
投影查询的用法:
- 查询语句需要时使用new关键字
- 在实体类中添加对应参数列表的构造函数,并添加无参构造方法
public void projectionQuery() {
Session session = HibernateUtils.getCurrentSession();
session.getTransaction().begin();
// 当工程中的类唯一时可以不用写全路径名,否则得写全路径名
Query query = session.createQuery("select new org.haiwen.entity.Goods(goodsName,goodsPrice) from Goods");
List list = query.list();
for (Object object : list) {
System.out.println(object);
}
session.getTransaction().commit();
}