1. 程式人生 > >Hibernate持久層框架使用【七】SQL語句

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));
}