SSH问题及解决之三 SpringSide3缺陷

http://code.google.com/p/springside/issues/detail?id=28
[quote]ss3中的PropertyFilter 好像没提供实现where 属性名1 like '%值1%' or 属性名1
like '%值2%' or 属性名1 like '%值3%' ...这种情况的
请问遇到这种情况该怎么实现呢,如果自己写就要丢掉page封装了[/quote]

我的项目也遇到这个问题, 而SpringSide确实没有提供好的解决方案,原因是PropertyFilter中的propertyValue, matchType没有使用数据类型进行声明定义, 而propertyNames是数组, 这就导至了, '或'(_OR_)操作时值和匹配类型必须一致.
我的做法是:
		// 1. '不等于' '或' '非空'的逻辑
Disjunction disjunction = Restrictions.disjunction();
// 不等于
Criterion neCriterion = buildPropertyFilterCriterion("workCenterId",
workCenterId, java.lang.Integer.class,
PropertyFilter.MatchType.NE);
// 或为空
Criterion nullCriterion = buildPropertyFilterCriterion("workCenterId",
null, java.lang.Integer.class, PropertyFilter.MatchType.NULL);
disjunction.add(neCriterion);
disjunction.add(nullCriterion);
finalList.add(disjunction);
// 2. 追加获得到的查询条件
List<Criterion> criterionList = this.buildCriterions(filters);
if (criterionList!=null && !criterionList.isEmpty()) {
finalList.addAll(criterionList);
}
Criterion[] criterions = finalList
.toArray(new Criterion[finalList.size()]);
return findPage(page, criterions);


如上, 由于项目进度关系没有去扩展ss, 对于这种或的关系自己做了较硬性的编码。

	/**
* 获得查询条件
*
* @param filters
* @return
*/
protected List<Criterion> buildCriterions(final List<PropertyFilter> filters) {
List<Criterion> criterionList = new ArrayList<Criterion>();
for (PropertyFilter filter : filters) {
if (!filter.isMultiProperty()) { // There is only one property
// need to compare the
// situation.
Criterion criterion = buildPropertyFilterCriterion(filter
.getPropertyName(), filter.getPropertyValue(), filter
.getPropertyType(), filter.getMatchType());
criterionList.add(criterion);
} else {// Contain multiple attributes need to compare the situation
// to carry out or deal with.
Disjunction disjunction = Restrictions.disjunction();
for (String param : filter.getPropertyNames()) {
Criterion criterion = buildPropertyFilterCriterion(param,
filter.getPropertyValue(),
filter.getPropertyType(), filter.getMatchType());
disjunction.add(criterion);
}
criterionList.add(disjunction);
}
}
return criterionList;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值