浏览 4720 次
锁定老帖子 主题:SpringSide搜索功能的扩展
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-07-28
最后修改:2009-07-28
SpringSide
很好很强大,整合了各式主流的、实用的、好玩的开源项目,非常值的学习。springSide3中有一个功能很实用、很方便、就是页面条件过滤(搜索)功能。由于springSide该功能目前只支持String类型的搜索,但在项目中仅仅只有String类型是远远不够的,所以自己就将其功能做了一些扩展。
围绕以上3点,我主要做了以下扩展: public enum MatchType { EQ, LIKE, LT, LE, GT, GE; }
添加了小于、小于等于、大于、大于等于. public static Class<?> getFieldType(Class<?> entityClass, String propertyName) { Assert.hasText(propertyName, "propertyName不能为空"); Class<?> propertyType = null; try { if (StringUtils.contains(propertyName, ".")) { for (String str : propertyName.split("\\.")) { Field declaredField = getDeclaredField(entityClass, str); entityClass = declaredField.getType(); } propertyType = entityClass; } else { propertyType = getDeclaredField(entityClass, propertyName).getType(); } } catch (Exception e) { throw new RuntimeException(e); } return propertyType; } public static Object convertValue(Object value, Class<?> toType) { Assert.notNull(value, "value不能为空"); Object result = null; try { if (toType == Date.class) { result = DateUtils.parseDate((String) value, new String[] { "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss" }); } else { result = OgnlOps.convertValue(value, toType); } } catch (Exception e) { throw new RuntimeException(e); } return result; } public static Object convertValue(Object value, Class<?> entityClass, String propertyName) { return convertValue(value, ReflectionUtils.getFieldType(entityClass, propertyName)); } 四、重构HibernateDao类中的buildPropertyFilterCriterion方法
protected Criterion buildPropertyFilterCriterion(final String propertyName, final Object value, final MatchType matchType) { Assert.hasText(propertyName, "propertyName不能为空"); Criterion criterion = null; Object pValue = null; try { pValue = HibernateWebUtils.convertValue(value, entityClass, propertyName); if (MatchType.EQ.equals(matchType)) { criterion = Restrictions.eq(propertyName, pValue); } if (MatchType.LIKE.equals(matchType)) { criterion = Restrictions.like(propertyName, (String) value, MatchMode.ANYWHERE); } if (MatchType.LT.equals(matchType)) { criterion = Restrictions.lt(propertyName, pValue); } if (MatchType.LE.equals(matchType)) { criterion = Restrictions.le(propertyName, pValue); } if (MatchType.GT.equals(matchType)) { criterion = Restrictions.gt(propertyName, pValue); } if (MatchType.GE.equals(matchType)) { criterion = Restrictions.ge(propertyName, pValue); } } catch (Exception e) { throw new RuntimeException(e); } return criterion; }
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-07-28
白衣应该会完善这个扩展的
|
|
返回顶楼 | |
发表时间:2009-07-28
嗯,应该会在3.15版中完善吧.
|
|
返回顶楼 | |
发表时间:2009-09-18
大家多发一些经典代码,让我们好好学习啊。
|
|
返回顶楼 | |
发表时间:2009-12-04
最后修改:2009-12-04
3.2.1已经看到完善了
/** * 属性比较类型. */ public enum MatchType { EQ, LIKE, LT, GT, LE, GE; } /** * 属性数据类型. */ public enum PropertyType { S(String.class), I(Integer.class), L(Long.class), N(Double.class), D(Date.class), B(Boolean.class); private Class<?> clazz; PropertyType(Class<?> clazz) { this.clazz = clazz; } public Class<?> getValue() { return clazz; } } private String[] propertyNames = null; private Class<?> propertyType = null; private Object propertyValue = null; private MatchType matchType = MatchType.EQ; public PropertyFilter() { } /** * @param filterName 比较属性字符串,含待比较的比较类型、属性值类型及属性列表. * eg. LIKES_NAME_OR_LOGIN_NAME * @param value 待比较的值. */ public PropertyFilter(final String filterName, final Object value) { String matchTypeStr = StringUtils.substringBefore(filterName, "_"); String matchTypeCode = StringUtils.substring(matchTypeStr, 0, matchTypeStr.length() - 1); String propertyTypeCode = StringUtils.substring(matchTypeStr, matchTypeStr.length() - 1, matchTypeStr.length()); try { matchType = Enum.valueOf(MatchType.class, matchTypeCode); } catch (RuntimeException e) { throw new IllegalArgumentException("filter名称" + filterName + "没有按规则编写,无法得到属性比较类型.", e); } try { propertyType = Enum.valueOf(PropertyType.class, propertyTypeCode).getValue(); } catch (RuntimeException e) { throw new IllegalArgumentException("filter名称" + filterName + "没有按规则编写,无法得到属性值类型.", e); } String propertyNameStr = StringUtils.substringAfter(filterName, "_"); propertyNames = StringUtils.split(propertyNameStr, PropertyFilter.OR_SEPARATOR); Assert.isTrue(propertyNames.length > 0, "filter名称" + filterName + "没有按规则编写,无法得到属性名称."); //按entity property中的类型将字符串转化为实际类型. this.propertyValue = ReflectionUtils.convertValue(value, propertyType); } |
|
返回顶楼 | |