Hibernate:HQL查询

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();
}
发布了202 篇原创文章 · 获赞 37 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/lovecuidong/article/details/99680740
今日推荐