在hibernate中是支持多条件动态查询的这种问题是非常实用的比如说你做一个项目要实现一个复合查询
例如有这么一个界面
那么要实现这个查询对于用户来说他的查询条件可能不健全有可能只填写其中的项那么要实现这个查询我们可以用hibernate的动态条件查询
下面我写一个例子
我有一张表叫user表
package comfishtestdao;
import javasqlDate;
public class User {
int id;
String name;
int age;
Date brithday;
public String getName() {
returnname;
}
public void setName(String name) {
thisname = name;
}
public int getAge() {
returnage;
}
public void setAge(int age) {
thisage = age;
}
public Date getBrithday() {
returnbrithday;
}
public void setBrithday(Date brithday) {
thisbrithday = brithday;
}
public int getId() {
returnid;
}
public void setId(int id) {
thisid = id;
}
}
Userhbmxml
<?xmlversion=encoding=UTF?>
<!DOCTYPEhibernatemapping PUBLIC
//Hibernate/HibernateMapping DTD //EN
hiber/hibernatemappingdtd>
<hibernatemapping>
<classname=comfishtestdaoUser>
<idname=id type=integer>
<generatorclass=increment></generator>
</id>
<propertyname=name></property>
<propertyname=age></property>
<propertyname=brithday></property>
</class>
</hibernatemapping>
在XXXcgfxml注册一下
然后我们写一个测试类
package comfishdomain;
import javasqlDate;
import javautilList;
import orghibernateCriteria;
import orghibernateSession;
import orghibernateTransaction;
import orghibernatecriterionDetachedCriteria;
import orghibernatecriterionRestrictions;
import comfishtestdaoUser;
import comfishutilHibernateSessionFactory;
public class Test {
public static void main(String[] args) {
// addData();
queryData();
}
// 添加数据
public static void addData() {
Session session = HibernateSessionFactorygetSession();
Transaction transaction = sessionbeginTransaction();
transactionbegin();
for (int i = ; i < ; i++) {
User user = new User();
usersetAge( + i);
usersetName(张 + i);
usersetBrithday(DatevalueOf());
sessionsave(user);
}
mit();
sessionclose();
}
// 查询数据
public static void queryData() {
String outName = 张;
int outAge = ;
Date outDate = null;
Session session = HibernateSessionFactorygetSession();
DetachedCriteria dc = DetachedCriteriaforClass(Userclass);
if (outName !=null) {
dcadd(Restrictionseq(nameoutName));
}
if (outAge > ) {
dcadd(Restrictionseq(age outAge));
}
if (outDate !=null) {
dcadd(Restrictionseq(brithday outDate));
}
Criteria c = dcgetExecutableCriteria(session);
List<User> list = clist();
for (User i : list) {
Systemoutprintln(igetName() + + igetAge());
}
}
}
看看测试类中的查询方法如果String outName = 张;
intoutAge = ;
DateoutDate = null;
这三个条件是通过从前台或者是用户输入的那么就实现了多条件的动态查询
我们看看数据库的信息
显然这个里面有一条记录是符合的我们看看输出的结果是什么
张
利用hibernate的好处是这样我只要个if语句就可以解决如果是我们的自己写的话我们分个不为空 种情况个不为空种情况 个不为空 种情况加上全空种情况 总共种情况然后我们在自己拼接hql或者sql语句很麻烦如果是个条件一起或者更加多动态查询就更加占优势了