ITPub博客

首页 > Linux操作系统 > Linux操作系统 > LOV精确查找

LOV精确查找

原创 Linux操作系统 作者:happyjin2004 时间:2012-06-14 21:35:18 0 删除 编辑
LOV默认是模糊匹配的,生成一个 包含like 关键字%这样的where子句,那么如果想要精确匹配该如何呢?
阅读了一下OAF的代码,发现它是这样做的:
1 框架会调用OAWebBeanHelper的setCriteriaOnVO方法,将LOV中设置的Criteria的值设置到VO里,
可以看到其调用了
oaviewobject.initQuery(adictionary);也就是VO的initQuery(Dictionary[] dictionaries)方法。
2 然后来看OAViewObjectImpl的这个方法里有什么玄机?
我循环打印了一下dictionary数组,每个dictionary代表了一个criteria,原来在此处我们输入的查找值已经被加上了%号,然后并且查询条件为like。
于是我在自己的VO里重写了initQuery方法:
for(int i=0,l=dictionarys.length;i
{   
dictionarys[i].put("criteriaCondition"," =");
String criteriaValue=dictionarys[i].get("criteriaValue").toString();
dictionarys[i].put("criteriaValue",criteriaValue.substring(0,criteriaValue.lastIndexOf("%")));

}
这样做了还是不行,发现成了没有任何限制,哦,还得调用父类的initQuery方法,在父类的这个方法里,实际上没做什么更多的事情,只是调用了一下executeQuery方法。
于是加上super.executeQuery();
3 发现还是不行,接着看源代码,发现调用了一个private方法setWhereClauseFromCriteria,在其中对于criteriaLookupName这个key对应的值为DSTART时,会自动加上like之类的,还会忽略大小写。
于是,完整代码如下:
public void initQuery(Dictionary[] dictionarys) 
{

for(int i=0,l=dictionarys.length;i
{   
dictionarys[i].put("criteriaCondition"," =");
String criteriaValue=dictionarys[i].get("criteriaValue").toString();
dictionarys[i].put("criteriaValue",criteriaValue.substring(0,criteriaValue.lastIndexOf("%")));
dictionarys[i].remove("criteriaLookupName");
}
super.initQuery(dictionarys);

}

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/21014973/viewspace-732857/,如需转载,请注明出处,否则将追究法律责任。

上一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2012-06-14

  • 博文量
    4
  • 访问量
    17758