Hibernate其它常用API

本文记录Java学习过程中遇到的Hibernate的Hibernate其它常用API~

Query

Query代表面向对象的一个Hibernate查询操作。在Hibernate中,通常使用session.createQuery()方法接受一个HQL语句,然后调用Query的list或uniqueResult()方法执行查询。所谓的HQL是Hibernate Query Language的缩写,其语法很像SQL语法,但它是完全面向对象的。

具体使用步骤如下:

  1. 获得Hibernate的Session对象;
  2. 编写HQL语句;
  3. 调用session.createQuery创建查询对象;
  4. 如果HQL语句包含参数,则调用Query的set方法设置参数;
  5. 调用Query对象的list()或uniqueResult()方法执行查询。

示例代码:

//查询所有记录
Query query = session.createQuery("from User");
List<User> userList = query.list();
System.out.println(userList);

//条件查询-?
Query query = session.createQuery("from User where username = ?");
query.setString(0, "oliver");
List<User> userList = query.list();
System.out.println(userList);

//条件查询-变量
Query query = session.createQuery("from User where username = :username and age= :age");
query.setString("username", "oliver");
query.setInteger("age", 18);
List<User> userList = query.list();
System.out.println(userList);

//分页查询
Query query = session.createQuery("from User");
query.setFirstResult(3);
query.setMaxResults(3);
List<User> userList = query.list();
System.out.println(userList);

Query中除了使用list()方法查询全部数据外,还有其它的一些常用方法,具体如下:

  • setter()方法:Query接口中提供了一系列的setter方法用于设置查询语句中的参数,针对不同的数据类型,需要使用不同的setter方法;
  • iterator()方法:该方法用于查询语句,返回的结果是一个Iterator对象,在读取时只能按照顺序方式读取,它仅把使用到的数据转化成Java实体对象;
  • uniqueResult()方法:该方法用于返回唯一的结果,在确保只有一条记录的查询时可以使用该方法;
  • executeUpdate()方法:该方法支持HQL语句的更新和删除操作;
  • setFirstResult()方法:该方法可以设置获取第一个记录的位置,也就是它表示从第几条记录开始查询,默认从0开始计算;
  • setMaxResults()方法:该方法用于设置结果集的最大记录数,通常与setFirstResult()方法结合使用,用于限制结果集的范围,以实现分页功能。

Criteria

Criteria是一个完全面向对象,可扩展的条件查询API,通过它完全不需要考虑数据库底层如何实现,以及SQL语句如何编写,它是Hibernate框架的核心查询对象。Criteria查询,又称为QBC查询(Query By Criteria),它是Hibernate的另一种对象检索方式。

Criteria是Hibernate提供的一个面向对象查询条件接口,一个单独的查询就是Criteria接口的一个实例,用于限制Criteria对象的查询,在Hibernate中Criteria对象的创建通常是通过Restrictions工厂类完成的。

使用Criteria对象查询数据的主要步骤如下:

  1. 获得Hibernate的Session对象;
  2. 通过Session获得Criteria对象;
  3. 使用Restrictions的静态方法创建Criteria条件对象。Restrictions类中提供了一系列用于设定查询条件的静态方法,这些静态方法都返回Criteria实例,每个Criteria实例代表一个查询条件;
  4. 向Criteria对象中添加Criteria查询条件。Criteria的add()方法用于加入查询条件;
  5. 执行Criteria的list()或uniqueResult()获得结果。

示例代码:

//查询所有记录
Criteria criteria = session.createCriteria(User.class);
List<User> userList =  criteria.list();
System.out.println(userList);

//条件查询
Criteria criteria = session.createCriteria(User.class);
criteria.add(Restrictions.eq("username"),"oliver");
List<User> userList =  criteria.list();
System.out.println(userList);

//条件查询
Criteria criteria = session.createCriteria(User.class);
criteria.add(Restrictions.eq("username"),"oliver");
criteria.add(Restrictions.eq("age"),38);
List<User> userList =  criteria.list();
System.out.println(userList);

//分页查询
Criteria criteria = session.createCriteria(User.class);
criteria.setFirstResult(3);
criteria.setMaxResults(3);
List<User> userList =  criteria.list();
System.out.println(userList);

注意:如果只返回一个值,可以使用uniqueResult()方法。

SQLQuery

SQLQuery比较简单,它用于接收一个SQL语句进行查询,然后调用list()或者uniqueResult()方法进行查询。但是SQL语句不会直接封装到实体对象中,需要我们手工封装。

示例代码:

//基本查询
SQLQuery sqlQuery = session.createSQLQuery("select * from User");
List<Object[]> list = sqlQuery.list();

for (Object[] objects : list) {
	System.out.println(Arrays.toString(objects));
}

//自动封装到对象中
SQLQuery sqlQuery = session.createSQLQuery("select * from User");
sqlQuery.addEntity(User.class);
List<User> list = sqlQuery.list();

for (User user : list) {
	System.out.println(user);
}

标签: none