论坛首页 Java企业应用论坛

介绍DynamicQueryTool,一个用于解决“拼装动态查询”的小工具。

浏览 37426 次
该帖已经被评为良好帖
作者 正文
   发表时间:2007-03-15  
yiding_he 写道
非常感兴趣!结果跑到 sf 上一看,一个文件都没有。

主要考虑到工具很小。看samples的代码就基本可以明白了,所以没有写文档。
可以下载源代码/web cvs,看samples下面的例子。

例子都是很简单的,基本上一看就清楚了。
0 请登录后投票
   发表时间:2007-03-15  
所谓动态查询, 一般都是指从 ui 上得来的查询条件吧,  如果是这样, 完全可以实现查询条件的自动装配, 我们的架构中, 增加一个查询条件只要在页面上声明就可以了, 后台自动转换为 Criteria 并叠加到已有条件上, e.g

xml 代码
 
  1. <td class="attribute">物资编码</td>  
  2. <td>  
  3.     <input name="conditions(code).name" type="hidden" value="code"/>  
  4.     <input name="conditions(code).operator" type="hidden" value="like"/>  
  5.     <input name="conditions(code).type" type="hidden" value="java.lang.String"/>  
  6.      <input name="conditions(code).value" value="<c:out value='${theForm.conditions["code"].value}'/>" />  
  7.   
  8. </td>  
0 请登录后投票
   发表时间:2007-03-15  
不管怎么说我觉得还是给动态查询带来很大方便的,关注
0 请登录后投票
   发表时间:2007-03-16  
Why not generate the SQL statement with template engine like
Velocity or FreeMarker.


select city.name cityName
from CITY city
where 1=1
#if($cityName)
and city.name like #{citytName}
#end


0 请登录后投票
   发表时间:2007-03-16  
zrq 写道
Why not generate the SQL statement with template engine like
Velocity or FreeMarker.


select city.name cityName
from CITY city
where 1=1
#if($cityName)
and city.name like #{citytName}
#end




跟我前面那个帖子思路很类似阿,这是具体实现方法了嘛!
0 请登录后投票
   发表时间:2007-03-16  
zrq 写道
Why not generate the SQL statement with template engine like
Velocity or FreeMarker.


select city.name cityName
from CITY city
where 1=1
#if($cityName)
and city.name like #{citytName}
#end




这个方法不错,我同意用这个方法阿,跟我前面法的帖子思路一样,这是具体实现的办法
0 请登录后投票
   发表时间:2007-03-20  
acceptTag 是否可以用一个HashMap代替? 虽然实际是一样的,但是我更倾向于放入HashMap,用遍历HashMap来调用acceptTag,而不是这样直接调用acceptTag。
0 请登录后投票
   发表时间:2007-08-26  
动态拼装我们是这样处理的,不知道这样如何

select * from aaa where 1 = 1
${and aaa.a = :aa}
${and aaa.b = :bb}

页面传入的查询条件vo中有aa这个参数,那么and aaa.a = ?
会拼接上去,sql编译成
select * from aaa where 1 = 1 and aaa.a = ?

相关的值会自动set到PrepareStatements中
感觉这样好像比用tag来分割看起来舒服
0 请登录后投票
   发表时间:2007-08-26  

Feiing 写道:
所谓动态查询, 一般都是指从 ui 上得来的查询条件吧,  如果是这样, 完全可以实现查询条件的自动装配, 我们的架构中, 增加一个查询条件只要在页面上声明就可以了, 后台自动转换为 Criteria 并叠加到已有条件上, e.g

xml 代码
 
  1. <td class="attribute">物资编码td>  
  2. <td>  
  3.     <input name="conditions(code).name" type="hidden" value="code"/>  
  4.     <input name="conditions(code).operator" type="hidden" value="like"/>  
  5.     <input name="conditions(code).type" type="hidden" value="java.lang.String"/>  
  6.      <input name="conditions(code).value" value="<c:out value='${theForm.conditions["code"].value}'/>" />  
  7.   
  8. td>  




我参与过一个类似的动态查询系统,和你的类似,并且实现了将用户的查询条件保存为常用报表功能,

同时用户可随意选择所要汇总的列以及这些列的显示顺序。

0 请登录后投票
   发表时间:2007-09-06  
动态生成查询语句后,还有一个给hql赋值的问题,比如
select o from User o  where 1 = 1  and o.name = :name  and o.age = :age  and o.height = :height 
如何给相应的参数赋值呢?也就是下面代码中的
executeQuery(String hql,Map params)
方法怎么写?

public Object executeQuery(String hql, Map params) {
		// very easy
		return null;
	}
public static final QueryTool QT = new QueryTool(new FilterTag("ignore",
			"<", ">", "</", ">"));

	private static final String userHql = " <count>select count(*)</count> <list>select o</list>  from User o "
			+ " <NOTNULL:departmentCity|NOTNULL:departmentName>join o.department dep</NOTNULL:departmentCity|NOTNULL:departmentName> where 1 = 1 <NOTNULL>and o.name = :userName</NOTNULL> <NOTNULL>and o.desc = :userDesc</NOTNULL>"
			+ " <NOTNULL>and o.sex = :sex</NOTNULL> <GTZERO>and o.age = :age</GTZERO> <GTZERO>and o.height = :height</GTZERO> <NOTNULL>and dep.city = :departmentCity</NOTNULL>"
			+ " <NOTNULL>and dep.name = :departmentName</NOTNULL>";

	private static final DynamicQFactory userHqlF = QT.pattern(userHql);

	private DynamicQ getQuryUserDynamicQ(UserQueryVO vo) {
		return userHqlF.newDynamicQ().setProperties(vo);
	}

	public List queryUsersByDynamicQ(UserQueryVO vo) {

		DynamicQResult dq = this.getQuryUserDynamicQ(vo).acceptTag("list")
				.generate();
		System.out.println(dq.getQueryStr());
		System.out.println(dq.getParams());

		return (List) executeQuery(dq.getQueryStr(), dq.getParams());

	}
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics