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