hibernate 多条件查询方法 收录
1. Hibernate多条件查询通用方法
-
//value[i]为第i个查询条件propertyName[i]的值
(本方法已通过测试) -
-
-
public
List intsearchByPropertys(String model,String[]propertyName,Object[] value, page, booleanrigor){ -
StringBuffer sqlBuffer = StringBuffer(); -
String ralation= like ;" -
-
ralation= = ;" -
} -
sqlBuffer.append( " +model+"as );model\n" -
len=propertyName.length; -
List list= ArrayList(); -
first= true; -
i= 0;i<len;i++){ -
-
-
sqlBuffer.append( where +" "model."+ propertyName[i] "+ ralation+ ?\n" ); -
list.add(value[i]); -
first= -
} -
sqlBuffer.append( and +" "model."+ propertyName[i] "+ralation+ ?\n" ); -
list.add(value[i]); -
} -
} -
} -
-
{ -
Session session=getSession(); -
Query queryObject = session.createQuery(sqlBuffer.toString()); -
i= 0;i<list.size();i++){ -
-
queryObject.setParameter(i, list.get(i)); -
} -
queryObject.setParameter(i, -
} -
-
} -
-
list=queryObject.list(); -
closeSession(session); -
list; -
} (RuntimeException re) { -
log.error( by ,property name failed" re); -
re; -
} -
- }
-
2:hibernate多条件组合查询 之 sql 拼接
这个方法与上面第一节中的相同,只不过上面的方法是将搜索的多个条件在外部(即调用方)封装在了数组中。
-
public
static void main(String[] args) { -
-
Session session = -
Transaction tx = -
List list = -
Criteria criteria = -
-
{ -
-
session = HibernateSessionFactory.getSession(); -
tx = session.beginTransaction(); -
-
DetachedCriteria detachedCriteria = DetachedCriteria -
.forClass(InfoTab. -
-
-
String sql= 1=1 ;" -
-
Integer pareaId = // 父地区; -
Integer careaId = // 子地区; -
Integer categoryId = // 类别; -
String infoPrivider = // 来源; -
String houseType= // 房屋类型; -
Integer hxBedRoom= // 室; -
Integer hxLivingRoom= // 厅; -
-
String hzHouseStatus= // 合租类型; -
String hzRequestSex= // 性别要求; -
String fixUp= // 装修程度; -
Integer lcHeightMolecuse= // 楼层; -
String orientation= // 朝向要求; -
Integer buildArea= // 建筑面积; -
Integer useArea= // 使用面积; -
Integer rentalDigit= // 租金/价格; -
String title= // 标题; -
-
-
{ -
sql+= + pareaId; -
} -
-
{ -
sql+= and careaId=" + careaId; -
} -
-
{ -
sql+= and categoryId=" + categoryId; -
} -
-
{ -
sql+= and infoPrivider='" + "'";infoPrivider + -
} -
-
{ -
sql+= and houseType='" + "'";houseType + -
} -
-
{ -
sql+= and hxBedRoom=" + hxBedRoom; -
} -
-
{ -
sql+= and hxLivingRoom=" + hxLivingRoom; -
} -
-
{ -
sql+= and hzHouseStatus='" + "'";hzHouseStatus + -
} -
-
{ -
sql+= and hzRequestSex='" + "'";hzRequestSex + -
} -
-
{ -
sql+= and fixUp='" + "'";fixUp + -
} -
-
{ -
sql+= and lcHeightMolecuse=" + lcHeightMolecuse; -
} -
-
{ -
sql+= and orientation='" + "'";orientation + -
} -
-
{ -
sql+= and buildArea=" + buildArea; -
} -
-
{ -
sql+= and useArea=" + useArea; -
} -
-
{ -
sql+= and rentalDigit=" + rentalDigit; -
} -
-
{ -
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(); -
-
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(); -
-
} (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,就不用自己判断了,如果没有关联条件查询的话,确实是好,可它的缺点就是不能查询关联中的条件。