主要内容:
- 条件查询【重点】
- 使用原生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语句在映射文件中的名字 - 使用
是为了避免sql语句中有xml中关键字重合的单词。
如:
Student.hbm.xml
说明:将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
说明:配置了一个过滤器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);
}
}
}
说明:我们在使用的时候先必须启用过滤器。了解即可。