hibernate 多条件查询方法 收录
1. Hibernate多条件查询通用方法
- //value[i]为第i个查询条件propertyName[i]的值
(本方法已通过测试) -
-
- 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(); -
} -
} -
此方法可多条件查询且可以根据关联的表条件进行查询
如查询某个商品:
表结构如下:
goods(商品表)
goodsid(商品id) goodsname(名称) typeid(分类-外键)
type(分类表)
typeid(id主键)
supplier(供应商表)
supplierid(ID主键)
你可建一个查询条件的类,里面包括你要查询的所有字段
如: public class Query{
..................
get/set方法................
}
得到查询条件后,可以把此类的一个对象传入自己做的方法,此方法可以根据条件的个数及是否输入条件进行查询:
public static List query_goods(Query query){
以上方面还可多层的嵌套,如type里还有外键,可以按照以上方法进行嵌套。注意,查询时所有涉及到的数据都将一次性写入类的属性中,包括有关联的,即此时goods的关联延迟加载无效,我觉得这一点非常的好。呵呵,有什么好处,可以自己好好的想想。
有许多人曾经提到过用Example,就不用自己判断了,如果没有关联条件查询的话,确实是好,可它的缺点就是不能查询关联中的条件。