Hibernate持久层框架使用【七】SQL语句

除了上篇博客介绍的HQL语句外,还可以使用SQL语句来进行数据的查询。

具体如何使用这里直接贴代码了:

首先建一个Sql.class类来测试一下

public class Sql {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		MySessionFactory mySessionFactory = new MySessionFactory();
		Session session = mySessionFactory.getSession();
		
		SQLQuery sqlQuery = session.createSQLQuery("select * from student");
		sqlQuery.addEntity(Student.class);
		
		List<Student> list = new ArrayList<>();
		list = sqlQuery.list();
		for(Student student : list)
		{
			System.out.println(student.getName());
		}
		
		mySessionFactory.commit();
		mySessionFactory.close();
	}

}

其中用到了SQLQuery,这个类是Query的一个子类,通过Session来创建SQLQuery对象。

步骤为:

1.通过Hibernate获取Session对象

2.通过Session创建SQLQuery对象

3.编写sql语句

4.使用addScalar或addEntity等方法进行实体的查询、标量的添加、实体的关联等操作

如上面的代码所示

从hibernate中获得session对象

Session session = mySessionFactory.getSession();

为了方便,这里的mySessionFactory是前面写的工具类,看不懂的话建议翻一下前面的博客

接着,就是创建SQLQuery对象了

SQLQuery sqlQuery = session.createSQLQuery("select * from student");
sqlQuery.addEntity(Student.class);

第一行代码创建了一个SQLQuery对象,以及编写好的sql语句

第二行代码使用了addEntity方法进行实体查询,声明返回的数据类型

到这里使用SQL语句进行查询的方式就完成了

List<Student> list = new ArrayList<>();
list = sqlQuery.list();
for(Student student : list)
{
	System.out.println(student.getName());
}

因为这里查询出来的数据不止一条,所以调用SQLQuery中的list方法将数据转为一个list集合,再进行输出

简化一下,可以将整个过程的代码写成如下形式

List<Student> list = session.createSQLQuery("select * from student")
	.addEntity(Student.class)
	.list();
for(Student student : list)
{
	System.out.println(student.getName()+student.getAge());
}

上面使用了addEntity方法进行实体查询,当需要查询数据中的几个特定的列时,可以使用addScalar方法进行标量添加

List<Object[]> list = session.createSQLQuery("select * from student as s")
		.addScalar("s.name")
		.addScalar("s.sid")
		.addScalar("s.age")
		.list();
		
for(Object[] student : list)
{
		System.out.println(Arrays.toString(student));
}

上面的代码中,使用了addScalar方法将name,sid,age这几个特定的列名进行标量添加,当输出student对象时,可以看到输出的数据中仅为这三个列的数据。

在使用SQLQuery时,我们可以采用命名查询的方式,将sql语句配置到xml文件中

例如这里新建一个SQLQuery.xml文件

配置内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>

	<sql-query name="query_student01">
		select s.* from student as s
		<!-- 实体查询addEntity -->
		<return alias="s" class="domain.Student"></return>
	</sql-query>
	
	<sql-query name="query_student02">
		select s.* from student as s
		<!-- 实体查询addEntity -->
		<return alias="s" class="domain.Student"></return>
		<!-- 标量查询addScalar -->
		<return-scalar column="s.name"/>
	</sql-query>
	
</hibernate-mapping>

这里定义了两个sql语句的配置,分别为query_student01,query_student02

先看一下第一个配置

<sql-query name="query_student01">
		select s.* from student as s
		<!-- 实体查询addEntity -->
		<return alias="s" class="domain.Student"></return>
</sql-query>

其中第一行代码为sql语句,第二行的return语句为返回的类型,alias表示别名,class表示返回的实体名

配置完成后在代码中调用getNamedQuery方法来使用这个配置即可

List<Student> list = session.getNamedQuery("query_student01").list();
for(Student student : list)
{
	System.out.println(student.getName());
}

第二个sql配置同样

<return-scalar column="s.name"/>

其中的return-scalar对应标量的添加,例如这里额外添加了name这个标量

同样的,在测试代码中调用这个配置

List<Object[]> list = session.getNamedQuery("query_student02").list();
for(Object[] student : list)
{
	System.out.println(Arrays.toString(student));
}

猜你喜欢

转载自blog.csdn.net/weixin_39885435/article/details/83445642