• 本文介绍了两种Hibernate多条件查询的方法。一个是通用方法,另一个则是用sql拼接,将搜索的多个条件在外部(即调用方)封装在了数组中。
  • 1. Hibernate多条件查询通用方法

//value[i]为第i个查询条件propertyName[i]的值          (本方法已通过测试)  

/*多条件查询,查询条件的值为空时自动除去该条件
* rigor为true时采用精确查询
*/

public List searchByPropertys(String model,String[]propertyName,Object[] value,int page,boolean rigor){

StringBuffer sqlBuffer = new StringBuffer();

String ralation=" like ";

if(rigor){

ralation=" = ";
}
sqlBuffer.append("from "+model+" as model\n");

int len=propertyName.length;

List list=new ArrayList();

boolean first=true;

for(int i=0;i< len;i++){

if(value[i]!=null){

if(first){

sqlBuffer.append(" where "+ "model."+ propertyName[i] + ralation+" ?\n");
list.add(value[i]);
first=false;

}else{

sqlBuffer.append(" and "+ "model."+ propertyName[i] +ralation+ " ?\n");
list.add(value[i]); } } }
try {
Session session=getSession(); Query queryObject = session.createQuery(sqlBuffer.toString());
for(int i=0;i< list.size();i++){

if(rigor){
queryObject.setParameter(i, list.get(i));
}else{

queryObject.setParameter(i, "%"+list.get(i)+"%");
} } list=queryObject.list(); closeSession(session);
return list;

} catch (RuntimeException re) {

log.error("find by property name failed", re);

throw re;
} }

2:hibernate多条件组合查询 之 sql 拼接

这个方法与上面第一节中的相同,只不过上面的方法是将搜索的多个条件在外部(即调用方)封装在了数组中。

public static void main(String[] args) {     

Session session = null;

Transaction tx = null;

List list = null;

Criteria criteria = null;

try {
session = HibernateSessionFactory.getSession(); tx = session.beginTransaction(); DetachedCriteria detachedCriteria = DetachedCriteria
.forClass(InfoTab.class);

String sql=" 1=1 ";

Integer pareaId = 0; // 父地区;

Integer careaId = 0; // 子地区;

Integer categoryId = 0; // 类别;

String infoPrivider = "中介"; // 来源;

String houseType= "地下室"; // 房屋类型;

Integer hxBedRoom=0; // 室;

Integer hxLivingRoom=0; // 厅;

String hzHouseStatus="有房出租"; // 合租类型;

String hzRequestSex="男"; // 性别要求;

String fixUp="尚未"; // 装修程度;

Integer lcHeightMolecuse=0; // 楼层;

String orientation="东南"; // 朝向要求;

Integer buildArea=2000; // 建筑面积;

Integer useArea=80; // 使用面积;

Integer rentalDigit=2000; // 租金/价格;

String title= "出租"; // 标题;

if(pareaId!=0)
{
sql+="pareaId=" + pareaId;
}
if(careaId!=0)
{
sql+=" and careaId=" + careaId;
}
if(categoryId!=0)
{
sql+=" and categoryId=" + categoryId;
}
if(!infoPrivider.equals(""))
{
sql+=" and infoPrivider='" + infoPrivider + "'";
}
if(!houseType.equals(""))
{
sql+=" and houseType='" + houseType +"'";
}
if(hxBedRoom!=0)
{
sql+=" and hxBedRoom=" + hxBedRoom;
}
if(hxLivingRoom!=0)
{
sql+=" and hxLivingRoom=" + hxLivingRoom;
}
if(!hzHouseStatus.equals(""))
{
sql+=" and hzHouseStatus='" + hzHouseStatus + "'";
}
if(!hzRequestSex.equals(""))
{
sql+=" and hzRequestSex='" + hzRequestSex +"'";
}
if(!fixUp.equals(""))
{
sql+=" and fixUp='" + fixUp + "'";
}
if(lcHeightMolecuse!=0)
{
sql+=" and lcHeightMolecuse=" + lcHeightMolecuse;
}
if(!orientation.equals(""))
{
sql+=" and orientation='" + orientation + "'";
}
if(buildArea!=0)
{
sql+=" and buildArea=" + buildArea;
}
if(useArea!=0)
{
sql+=" and useArea=" + useArea;
}
if(rentalDigit!=0)
{
sql+=" and rentalDigit=" + rentalDigit;
}
if(!title.equals(""))
{
sql+=" and title like '%" + title + "%'";
}
sql+=" order by id desc";
System.out.println(sql); detachedCriteria.add(Restrictions.sqlRestriction(sql)); criteria = detachedCriteria.getExecutableCriteria(session); list = criteria.list();
for(int i=0;i< list.size();i++)
{ InfoTab infoTab = (InfoTab)list.get(i);
System.out.println(infoTab.getTitle() +" "+ infoTab.getCategoryId() +" "+ infoTab.getPareaName() +" "+ infoTab.getCareaName() +" " + infoTab.getHouseType() +" " + infoTab.getInfoPrivider());
} tx.commit();
} catch (HibernateException he) {
he.printStackTrace(); } }