欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-03-02 13:50:25
...

除了上篇博客介绍的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));
}

 

相关标签: hibernate