Hibernate框架进行数据库查询:doQuery和QuerySql的区别

172 阅读3分钟

在Hibernate中,doQuery和QuerySql是两种常用的执行数据库查询的方法。

1. doQuery()方法

doQuery()方法是Hibernate提供的标准方法,用于执行HQL(Hibernate Query Language)查询。HQL是一种面向对象的查询语言,类似于SQL语言,但更加灵活和易于理解。使用HQL语句可以方便地查询实体类和关联关系。

例如,我们可以使用以下代码从数据库中获取所有Student对象:

List results = session.createQuery("from Student").list();

其中,session是一个Session对象,表示当前的数据库会话;createQuery()方法用于创建一个HQL查询;"from Student"是查询的HQL语句,表示我们要查询Student表;list()方法用于执行查询并将结果转换为List对象。

2. QuerySql()方法

QuerySql()方法是Hibernate提供的另一个方法,用于执行原生SQL查询。使用原生SQL语句可以执行更复杂的查询操作,例如跨表查询、分组查询等。

例如,我们可以使用以下代码从数据库中获取年龄大于20岁的所有学生记录:

String sql = "SELECT * FROM student WHERE age > 20";
List results = session.createSQLQuery(sql).list();

其中,session是一个Session对象,表示当前的数据库会话;createSQLQuery()方法用于创建一个原生SQL查询;"SELECT * FROM student WHERE age > 20"是查询的SQL语句,表示我们要查询年龄大于20岁的所有学生记录;list()方法用于执行查询并将结果转换为List对象。

3. 底层源码分析

虽然doQuery()方法和QuerySql()方法都可以用于执行数据库查询,但是它们的底层实现却有所不同。具体来说:

doQuery()方法的底层源码分析

doQuery()方法实际上是通过调用Hibernate的Criteria API来实现查询操作的。Criteria API是Hibernate提供的一种面向对象的查询API,它可以让我们以面向对象的方式构建复杂的查询条件。例如:

Criteria criteria = session.createCriteria(Student.class);
criteria.add(Restrictions.gt("age", 20));
List results = criteria.list();

以上代码创建了一个名为“criteria”的Criteria对象,用于表示我们要对“Student”实体类进行查询操作;然后调用add()方法添加了一个查询条件,表示我们要查询年龄大于20岁的学生记录;最后调用list()方法执行查询并将结果转换为List对象。

QuerySql()方法的底层源码分析

QuerySql()方法则是通过调用Hibernate的JDBC API来实现查询操作的。JDBC API是Java提供的一套标准的数据库访问接口,它提供了许多通用的数据库操作方法,例如查询、插入、更新和删除等。例如:

String sql = "SELECT * FROM student WHERE age > ?";
PreparedStatement statement = session.connection().prepareStatement(sql);
statement.setInt(1, 20);
ResultSet resultSet = statement.executeQuery();
List results = new ArrayList<>();
while (resultSet.next()) {
    Student student = new Student();
    student.setId(resultSet.getInt("id"));
    student.setName(resultSet.getString("name"));
    // ...设置其他属性值...
    results.add(student);
}

以上代码创建了一个名为“statement”的PreparedStatement对象,用于表示我们要执行一条SQL语句;然后调用setInt()方法设置查询条件,表示我们要查询年龄大于20岁的学生记录;接着调用executeQuery()方法执行查询并将结果保存到ResultSet对象中;最后遍历ResultSet对象并将每行数据封装成一个Student对象,最终得到一个包含所有符合条件的学生记录的List对象。