您的位置:首页 > 其它

hibernate的多条件动态查询(非常实用)

2013-08-18 10:19 435 查看
在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<User> list = c.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个条件一起或者更加多,动态查询就更加占优势了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: