在hibernate中是支持多条件动态查询的。这种问题是非常实用的。比如说你做一个项目要实现一个复合查询。
例如有这么一个界面:
那么要实现这个查询,对于用户来说他的查询条件可能不健全。有可能只填写其中的1-3项。那么要实现这个查询。我们可以用hibernate的动态条件查询。
下面我写一个例子。
我有一张表叫user表。
package com.fish.testdao;
import java.sql.Date;
public class User {
int id;
String name;
int age;
Date brithday;
public String getName() {
returnname;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
returnage;
}
public void setAge(int age) {
this.age = age;
}
public Date getBrithday() {
returnbrithday;
}
public void setBrithday(Date brithday) {
this.brithday = brithday;
}
public int getId() {
returnid;
}
public void setId(int id) {
this.id = id;
}
}
User.hbm.xml
xmlversion="1.0"encoding="UTF-8"?>
DOCTYPEhibernate-mapping PUBLIC
"-//Hibernate/HibernateMapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<classname="com.fish.testdao.User">
<idname="id" type="integer">
<generatorclass="increment">generator>
id>
<propertyname="name">property>
<propertyname="age">property>
<propertyname="brithday">property>
class>
hibernate-mapping>
在XXX.cgf.xml注册一下。
然后我们写一个测试类
package com.fish.domain;
import java.sql.Date;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Restrictions;
import com.fish.testdao.User;
import com.fish.util.HibernateSessionFactory;
public class Test8 {
public static void main(String[] args) {
// addData();
queryData();
}
// 添加数据
public static void addData() {
Session session = HibernateSessionFactory.getSession();
Transaction transaction = session.beginTransaction();
transaction.begin();
for (int i = 0; i < 10; i++) {
User user = new User();
user.setAge(10 + i);
user.setName("张" + i);
user.setBrithday(Date.valueOf("1990-12-04"));
session.save(user);
}
transaction.commit();
session.close();
}
// 查询数据
public static void queryData() {
String outName = "张3";
int outAge = 13;
Date outDate = null;
Session session = HibernateSessionFactory.getSession();
DetachedCriteria dc = DetachedCriteria.forClass(User.class);
if (outName !=null) {
dc.add(Restrictions.eq("name",outName));
}
if (outAge > 0) {
dc.add(Restrictions.eq("age", outAge));
}
if (outDate !=null) {
dc.add(Restrictions.eq("brithday", outDate));
}
Criteria c = dc.getExecutableCriteria(session);
List
for (User i : list) {
System.out.println(i.getName() +" " + i.getAge());
}
}
}
看看测试类中的查询方法。如果String outName = "张3";
intoutAge = 13;
DateoutDate = null;
这三个条件是通过从前台或者是用户输入的那么就实现了多条件的动态查询。
我们看看数据库的信息:
显然这个里面有一条记录是符合的,我们看看输出的结果是什么
张3 13
利用hibernate的好处是这样我只要3个if语句就可以解决。如果是我们的自己写的话,我们分:3个不为空 1种情况,2个不为空3种情况, 1个不为空 3种情况,加上全空1种情况。 总共8种情况,然后我们在自己拼接hql或者sql语句很麻烦,如果是4个条件一起或者更加多,动态查询就更加占优势了。