浅谈J-Hi查询过滤器的实现原理

发表于:2011-3-15 09:43

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:张昊    来源:51Testing软件测试网采编

#
java

  J-Hi设计自己的查询过滤器而没有直接采用Hibernate的Criteria,是出于以下两个原因:

  1、Hibernate的Criteria的功能是很强大,但在使用上还是比较繁琐。因此J-Hi想从用户使用的简单易用性上考虑设计一款查询过滤器。

  2、J-Hi是一款跨ORM的多框架平台,不能拘泥一种只在Hibernate适用的产品。因此从设计角度考虑,J-Hi对于查询过滤功能必须要有一个中间层,从而使适应多ORM框架成为可能。

  下面让我们来分析一下对于SQL的查询具体应该考虑些什么

  1、字段名:数据库表的字段名

  2、操作符:比如大于、小于……。还会包括一些特殊的操作符如like和in

  3、NO:NO操作符是对操作符的补充,只有in和lik也会有no

  4、值:对应字段类型的具体值,如字符串就要加引号,日期就要做转换

  5、空值:空值是特殊值,表述形式如IS NULL或IS NOT NULL

  6、关系符:两个查询条件之间的关系包括三种 AND OR NOT

  7、优前级:通过左右括号来控制查询条件的优前级

  8、通配符:如果是like操作符,在值的左侧或是右侧或两侧都可以通过%来控制值的匹配条件

  对于java来说,无非就是考虑如何将上述的描述通过对象化的方式实现

  先让我们用例说明:

Filter filter = FilterFactory.getSimpleFilter("name""马超");

  首先所有的过滤器都必须由FilterFactory(过滤器工厂)创建,参数依次为

  name:POJO的属性名的字符串,可以通过.级联如(org.id);

  value:待过滤的过滤值

  oprtion:操作符,提供多种操作符,具体参见javadoc

  relation:关系符,两个过滤器之间的关系,如AND / OR / NOT

  过滤器可以通过addCondition方法累加过滤条件,例如:

filter.addCondition("name""赵云", Filter.OPERATOR_EQ,Filter.RELATION_OR);

  调用addCondtion()方法返回是条件累加后的Filter,因此你可以一直不断的调用addCondtion()方法,而不用每做一个过滤条件就创建一个新的Flter。

  也可以通过addFilter方法将两个过滤器连接合并在一起

otherFilter.addFilter(filter, Filter.RELATION_AND);

  因为一个过滤器会有多个查询条件,因此在通过addFilter()将两上过滤器进行合并时会对这两个过滤器自动加左右括号。对应sql为:

(otherFilter的查询条件) and (name like ‘%马超%’ or name = ‘赵云’ )

21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号