Struts Hibernate Spring 后台数据查询
本文源自:http://blog.csdn.net/tannongchun/article/details/11034047 ,感谢作者的分享
自定义查询PropertyFilter与QBC
1、页面参数传递规则
参数规则:前缀+"_"+操作符+属性类型+"_"+属性名称
前缀:以"filter"开头
操作符:NE,EQ, LIKE,SLIKE,ELIKE, LT, GT, LE, GE;//不等于,等于,全模糊匹配,左匹配、右匹配,小于、大于
属性类型:S代表String,I代表Integer,L代表Long, N代表Double, D代表Date,B代表Boolean
属性名称:bo属性名称
Filter_ EQD_taskDate
1)常用查询
filter_LIKES_name 等价于 "from Menu mwhere m.name like '%?%'"
1)多个属性间用"_OR_"分割
filter_EQL_id_OR_parentId 等价于 "from Menu mwhere m.id = ? or m.parentId =?"
2)BO包含实体的子属性以两条下划线分割"__"(注:非主键需要设置别名参看第5点【使用别名的查询】)
filter_EQL_id_OR_parentMenu__id等价于 " from Menu m where m.id =? or m.parentMenu.id =?"
public class Menu{
private String id;//主键ID
private Menu parentMenu;//父级菜单
}
2、自定义构造PropertyFilter,无需前缀,其余不变。
例如:
//根据过来规则构造页面传递的参数
List<PropertyFilter>filters = HibernateWebUtils
.buildPropertyFilters(Struts2Utils.getRequest());
PropertyFilter propertyFilter = newPropertyFilter("LIKES_name","菜单管理");
//自定义的过滤规则添加到filters中进行分页查询
filters.add(propertyFilter);
//等价于 "from Menu mwhere m.name like '%菜单管理%'"
3、PropertyFilter结合Hibernate QBC查询.
注意:PropertyFilter仅支持NE,EQ, LIKE,SLIKE,ELIKE, LT, GT, LE, GE这几种查询方式
如果需求超出以上范围需要按照原始方式查询数据或者直接使用Hibernate QBC查询方式
类EntityManager提供了PropertyFilter转换成Criterion的方法,
这样可以结合PropertyFilter以及原始QBC查询满足不同需求
List<PropertyFilter>转Criterion[]
public Criterion[] getCriterionsByFilter(List<PropertyFilter>filters)
自定义Criterion查询:通过以下方法实现分页查询
publicPage<T> findByCriteria(Page<T> page, Criterion... criterions)
throws DaoException, SystemException,ServiceException
示例代码:
//根据过来规则构造页面传递的参数
List<PropertyFilter> filters =HibernateWebUtils
.buildPropertyFilters(Struts2Utils.getRequest());
//PropertyFilter转换Criterion
Criterion[] cs = sensorDataReportService.getCriterionsByFilter(filters);
//between条件
Criterion c = Restrictions.between("createTime",new Date(), new Date());\
//合并查询条件
cs = (Criterion[])ArrayUtils.add(cs, 0, c);
//分页查询
Page<Menu>p = new Page<Menu>(20);//分页对象
p =menuManger.findByCriteria(p, cs);
public void eqJoin(String key,Object val) {
if (val != null && val != "") {
String[] keys = key.split("\\.");
switch (keys.length) {
case 3:
detachedCriteria.createCriteria(keys[0]).createCriteria(keys[1]).add(Restrictions.eq(keys[2], val));
break;
case 4:
detachedCriteria.createCriteria(keys[0]).createCriteria(keys[1]).
createCriteria(keys[2]).add(Restrictions.eq(keys[3], val));
break;
case 5:
detachedCriteria.createCriteria(keys[0]).
createCriteria(keys[1]).createCriteria(keys[2]).
createCriteria(keys[3]).add(Restrictions.eq(keys[4], val));
break;
}
flag = true;
}
}
4、附QBC参数构造方法
Restrictions工具类:
eq --> equal,=等于.
ne --> not equal,<>不等于.
allEq --> 参数为Map对象,使用key/value进行多个等于的比对,相当于多个Restrictions .eq 的效果
gt --> great-than > 大于
ge --> great-equal >= 大于等于
lt --> less-than, < 小于
le --> less-equal <= 小于等于
between --> 对应SQL的between子句
like --> 对应SQL的LIKE子句
in --> 对应SQL的in子句
and --> and 关系
or --> or 关系
isNull --> 判断属性是否为空,为空则返回true
isNotNull --> 与isNull相反
sqlRestriction --> SQL限定的查询
Order.asc --> 根据传入的字段进行升序排序
Order.desc --> 根据传入的字段进行降序排序
MatchMode.EXACT --> 字符串精确匹配.相当于"like 'value'"
MatchMode.ANYWHERE --> 字符串在中间匹配.相当于"like '%value%'"
MatchMode.START --> 字符串在最前面的位置.相当于"like 'value%'"
MatchMode.END --> 字符串在最后面的位置.相当于"like '%value'"
5、使用别名的查询
在使用外键查询的时候会报错,可能是由于Hibernate自身的限制,具体原因未考察,只知道这个时候需要使用别名查询。
例如:
//能够正常使用
PropertyFilterp = Propertyfilter("EQL_parentMenu__id","1");
//等价于 “from Menu m wherem.parentMenu.id = ?”
// 无效方式
PropertyFilterp = Propertyfilter("LIKES_parentMenu__name","管理");
//等价于 “from Menu m where m.parentMenu.namelike ?”(此HQL语句是可以正常查询出数据)
自定义查询只是简单的一种封装,如果要使用别名查询的,可以自行扩展DAO实现相关查询需求。
扩展DAO层,设置别名(其实只要覆盖父类方法即可)
@Repository
public classMenuDao extends HibernateDao<Menu, Long> {
/**
* 设置别名(覆盖父类SimpleHibernateDao方法).
* @param filters
* @return
*/
public CriteriacreateCriteria(final Criterion... criterions) {
Criteria criteria =getSession().createCriteria(entityClass);
//设置别名
criteria.createAlias("parentMenu", "pm");
for (Criterion c : criterions) {
criteria.add(c);
}
return criteria;
}
}
使用方法(特别注意:使用“LIKES_pm__name”而非“LIKES_parentMenu__name”)
List<PropertyFilter>filters = HibernateWebUtils.buildPropertyFilters(Struts2Utils.getRequest());
PropertyFilterp = Propertyfilter("LIKES_pm__name","管理");
filters.add(p);
...
相关推荐
java开发前后台技术,包含java struts hibernate spring html javascript等
本人自己动手集成的struts+spring+hibernate 网站后台管理系统,希望对刚学习struts的朋友带来一定的帮助,这是我上传此文件的最大愿望,里面有三个框架所需要的jar包和所有的配置文件,只要下载即可运行,不需要...
基于Spring+Struts+Hibernate的轻型架构实现生产数据采集系统.pdf 基于SSH构架的MIS用户管理模块的实现.pdf 基于SSH的播客资源平台的设计与实现.pdf 基于SSH的本科教学评估辅助系统的设计与实现.pdf 基于SSH的物流...
struts2+hibernate+Spring后台表格分页
本文是开发基于spring的web应用的入门文章,前端采用Struts MVC框架,中间层采用spring,后台采用Hibernate。 本文包含以下内容: •配置Hibernate和事务 •装载Spring的applicationContext.xml文件 •...
(1)该项目是基于spring3+struts2+hibernate3+spring security3的权限管理项目 (2)后台我已经实现了权限管理,包括用户,角色和资源的分配。前台实现了spring security3的管理 (3)网上案例普遍是后台单一登陆。...
当当网struts+hibernate+spring,开发的仿当当网,达内科技研发,是学web的好参考。
新闻发布系统,用struts+spring+hibernate实现
一个工程是struts2+spring2.5+hibernate3.3整合的服务器端技术(全注解)(云端),另一个工程是android的手机应用,包含对ssh整合的云端数据的访问,能够在android输入信息,将数据传递给服务器的struts2以及后台...
spring struts hibernate 最详细的整合,无bug !前台到后台能运行起来的!
在此贴出来与大家共享,绝对真实,提供数据库,需求文档,源代码,只要部署着Myclipse上,配置好数据库直接可以运行。如不清楚,我里面有说明文档。
(2)运用struts1.2+hibernate+spring 框架,数据库连接池,事务管理; (3)Struts 应用国际化,Struts 标签库与Tiles框架, JSTL标签库,Spring IOC; (4)采用优化性能技术,采用oscache缓存,freemarker静态页面生成; (5)...
struts2 spring hibernate环境 主要是select标签从数据库读数据,形成下拉列表框
自己做的Struts2 Spring Hibernate小程序,给有需要参考的朋友 可以页面验证,也可以后台验证 session回收和事务处理也做了
java web开发初学者的绝佳入门实例,摒弃细枝末节,凸显核心思想。对之前新闻发布系统功能的扩充优化,增加了后台管理(不同管理员负责不同业务,登录界面:http://localhost:8080/news/adminLogin.jsp)。
Java Web Demo,前台使用easyUI控件、jQuery技术,后台使用Spring、Struts、Hibernate技术。具体运行参考:http://blog.csdn.net/fansy1990/article/details/39319335
struts2 + spring + hibernate3实现的投票系统后台,值得参考开发
一个基于hibernate+spring+struts的学生选课系统源码
Java博客系统源码 Hibernate4,Spring4,Struts2 整合 html5后台easyui
java web开发初学者的绝佳入门实例,展现目前web开发最主流框架:struts+hibernate+spring,提供前台新闻页面浏览和后台新闻发布、用户管理、授权功能。