主要內容:
- 條件查詢【重點】
- 使用原生sql查詢
- 外置命名查詢
- 查詢過濾器
一、條件查詢(工程hibernate_hql
)
測試:
SimpleConditionQueryTest.java
public void testQuery1() {
Session session = null;
try {
session = HibernateUtils.getSession();
session.beginTransaction();
//可以拼字符串
List students = session.createQuery("select s.id, s.name from Student s where s.name like '%1%'").list();
for (Iterator iter=students.iterator(); iter.hasNext();) {
Object[] obj = (Object[])iter.next();
System.out.println(obj[0] + "," + obj[1]);
}
session.getTransaction().commit();
}catch(Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}finally {
HibernateUtils.closeSession(session);
}
}
說明:這里我們使用的是模糊查詢,使用'%1%'
,但是一般最好這樣'%%1%%'
,因為前者有時候會有點問題。需要注意的是在hibernate中賦值時不是從1開始,而是從0開始。
還有一些其他方式的查詢:
/*Query query = session.createQuery("select s.id, s.name from Student s where s.name like ?");
query.setParameter(0, "%1%");
List students = query.list();*/
//可以使用?方式傳遞參數
//參數的索引從0開始
//傳遞的參數值,不用單引號引起來
//注意方法鏈編程
List students = session.createQuery("select s.id, s.name from Student s where s.name like ?").setParameter(0, "%1%").list();
for (Iterator iter=students.iterator(); iter.hasNext();) {
Object[] obj = (Object[])iter.next();
System.out.println(obj[0] + "," + obj[1]);
}
---------------------------------------------------------
//使用 :參數名稱 的方式傳遞參數值
List students = session.createQuery("select s.id, s.name from Student s where s.name like :myname").setParameter("myname", "%1%").list();
---------------------------------------------------------
//使用 :參數名稱 的方式傳遞參數值
List students = session.createQuery("select s.id, s.name from Student s where s.name like :myname and s.id=:myid").setParameter("myname", "%1%").setParameter("myid", 12).list();
說明:hibernate4中推薦使用后面兩種方式,不推薦使用通配符方式。
//支持in,需要使用setParameterList進行參數傳遞
List students = session.createQuery("select s.id, s.name from Student s where s.id in(:myids)").setParameterList("myids", new Object[]{1, 2, 3, 4, 5}).list();
---------------------------------------------------
//查詢2008年2月創建的學生
List students = session.createQuery("select s.id, s.name from Student s where date_format(s.createTime, '%Y-%m')=?").setParameter(0, "2008-02").list();
---------------------------------------------------
//查詢2008-01-10到2008-02-15創建的學生
List students = session.createQuery("select s.id, s.name from Student s where s.createTime between ? and ?")
.setParameter(0, sdf.parse("2008-01-10 00:00:00"))
.setParameter(1, sdf.parse("2008-02-15 23:59:59")).list();
說明:第一種方式中我們使用setParameterList
方法可以傳遞一個數組進行查詢。而后兩種方法中我們可以看到可以使用數據庫的函數查詢某個時間段的數據。這里的三種查詢方式比較重要。
二、使用原生sql進行查詢
SqlQueryTest.java
package cn.itcast.hibernate;
import java.util.Iterator;
import java.util.List;
import org.hibernate.Session;
import junit.framework.TestCase;
/**
* 原生sql測試
*/
public class SqlQueryTest extends TestCase {
public void testQuery1() {
Session session = null;
try {
session = HibernateUtils.getSession();
session.beginTransaction();
List students = session.createSQLQuery("select * from t_student").list();
for (Iterator iter=students.iterator(); iter.hasNext();) {
Object[] obj = (Object[])iter.next();
System.out.println(obj[0] + "," + obj[1]);
}
session.getTransaction().commit();
}catch(Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}finally {
HibernateUtils.closeSession(session);
}
}
}
說明:使用原生sql查詢和之前一些例子沒有什么不同,這里不詳細講了。
三、外置命名查詢
- 將sql語句放在任何映射文件(如
Student.hbm.xml
)中,使用方法getNamedQuery得到sql語句在映射文件中的名字 - 使用
<![CDATA[]]>
是為了避免sql語句中有xml中關鍵字重合的單詞。
如:
Student.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="cn.itcast.hibernate.Student" table="_student">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<property name="createTime"/>
<many-to-one name="classes" column="classesid"/>
</class>
<query name="searchStudents">
<![CDATA[
SELECT s FROM Student s where s.id<?
]]>
</query>
</hibernate-mapping>
說明:將hql放在配置文件中就可以在程序中使用了,這里我們是放在Student.hbm.xml
中,其實放在Classes.hbm.xml
中也是可以的。只要其名字不重復即可。
測試:
NameQueryTest.java
package cn.itcast.hibernate;
import java.util.Iterator;
import java.util.List;
import org.hibernate.Session;
import junit.framework.TestCase;
/**
* 外置命名查詢
*/
public class NameQueryTest extends TestCase {
public void testQuery1() {
Session session = null;
try {
session = HibernateUtils.getSession();
session.beginTransaction();
List students = session.getNamedQuery("searchStudents")
.setParameter(0, 10)
.list();
for (Iterator iter=students.iterator(); iter.hasNext();) {
Student student = (Student)iter.next();
System.out.println(student.getName());
}
session.getTransaction().commit();
}catch(Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}finally {
HibernateUtils.closeSession(session);
}
}
}
說明:其實這種方式在實際開發中用的也比較少,了解即可。
四、查詢過濾器
首先需要在配置文件中進行配置:
Student.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="cn.itcast.hibernate.Student" table="_student">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<property name="createTime"/>
<many-to-one name="classes" column="classesid"/>
<filter name="filtertest" condition="id < :myid"/>
</class>
<filter-def name="filtertest">
<filter-param name="myid" type="integer"/>
</filter-def>
</hibernate-mapping>
說明:配置了一個過濾器filtertest,其中條件是id < :myid;
其中<
是轉義的小于號,注意myid名字中不能有空格。
測試:
FilterQueryTest.java
package cn.itcast.hibernate;
import java.util.Iterator;
import java.util.List;
import org.hibernate.Session;
import junit.framework.TestCase;
/**
* 查詢過濾器
*/
public class FilterQueryTest extends TestCase {
public void testQuery1() {
Session session = null;
try {
session = HibernateUtils.getSession();
session.beginTransaction();
//啟用過濾器
session.enableFilter("filtertest").setParameter("myid", 10);
List students = session.createQuery("from Student").list();
for (Iterator iter=students.iterator(); iter.hasNext();) {
Student student = (Student)iter.next();
System.out.println(student.getName());
}
session.getTransaction().commit();
}catch(Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}finally {
HibernateUtils.closeSession(session);
}
}
}
說明:我們在使用的時候先必須啟用過濾器。了解即可。