2008-06-03
如何正确使用HQL进行查询?
关键字: hql查询
一开始我是这样写的,将HQL和Query参数设置通过一个判断写在一起了,但是随之而来的问题就出现了,在createQuery之后增加的参数会报未定义该参数。
有一种方法可以解决,就是将hql和query设置参数进行分开,但是需要判断两次,太繁琐了,如下: 大家有什么好的建议吗?
如果必须选择HQL来进行过滤的话,大伙是如何操作的呢?
public List<CheckItemIntervalResult> query(Map<String,String> filterMap){
List<CheckItemIntervalResult> lists = new ArrayList<CheckItemIntervalResult>();
if(!filterMap.isEmpty()){
System.out.println(filterMap.size());
String checkItemIntervalId = filterMap.get("checkItemIntervalId");
String actionResult = filterMap.get("actionResult");
String actionTimeStart = filterMap.get("actionTimeStart");
String actionTimeEnd = filterMap.get("actionTimeEnd");
StringBuffer hql = new StringBuffer();
hql.append("from CheckItemIntervalResult where 1=1");//这里的hql不好定义,因为这里还不知道到底需要过滤哪几个条件
Query query = createQuery(hql.toString());
if(StringUtils.isNotBlank(checkItemIntervalId)){
hql.append(" and checkItemInterval_id=:checkItemIntervalId ");
query.setString("checkItemIntervalId", checkItemIntervalId);
}
if(StringUtils.isNotBlank(actionResult)){
hql.append(" and actionResult =:actionResult");
query.setString("actionResult", actionResult);
}
DateUtils dateUtils = new DateUtils("yyyy-MM-dd");
if(StringUtils.isNotBlank(actionTimeStart) && StringUtils.isBlank(actionTimeEnd)){
hql.append(" and actionTime >= :actionTimeStart");
query.setDate("actionTimeStart", dateUtils.string2Date(actionTimeStart));
}
if(StringUtils.isBlank(actionTimeStart) && StringUtils.isNotBlank(actionTimeEnd)){
hql.append(" and actionTime <= :actionTimeEnd");
query.setDate("actionTimeEnd", dateUtils.string2Date(actionTimeEnd));
}
if(StringUtils.isNotBlank(actionTimeStart) && StringUtils.isNotBlank(actionTimeEnd)){
hql.append(" and actionTime between :actionTimeStart and :actionTimeEnd");
query.setDate("actionTimeStart", dateUtils.string2Date(actionTimeStart));
query.setDate("actionTimeEnd", dateUtils.string2Date(actionTimeEnd));
}
hql.append(" order by actionTime desc");
System.out.println(hql);
lists=query.list();
}
return lists;
}
有一种方法可以解决,就是将hql和query设置参数进行分开,但是需要判断两次,太繁琐了,如下: 大家有什么好的建议吗?
public List<CheckItemIntervalResult> query(Map<String,String> filterMap){
List<CheckItemIntervalResult> lists = new ArrayList<CheckItemIntervalResult>();
if(!filterMap.isEmpty()){
System.out.println(filterMap.size());
String checkItemIntervalId = filterMap.get("checkItemIntervalId");
String actionResult = filterMap.get("actionResult");
String actionTimeStart = filterMap.get("actionTimeStart");
String actionTimeEnd = filterMap.get("actionTimeEnd");
StringBuffer hql = new StringBuffer();
hql.append("from CheckItemIntervalResult where 1=1");
if(StringUtils.isNotBlank(checkItemIntervalId)){
hql.append(" and checkItemInterval_id=:checkItemIntervalId ");
}
if(StringUtils.isNotBlank(actionResult)){
hql.append(" and actionResult =:actionResult");
}
if(StringUtils.isNotBlank(actionTimeStart) && StringUtils.isBlank(actionTimeEnd)){
hql.append(" and actionTime >= :actionTimeStart");
}
if(StringUtils.isBlank(actionTimeStart) && StringUtils.isNotBlank(actionTimeEnd)){
hql.append(" and actionTime <= :actionTimeEnd");
}
if(StringUtils.isNotBlank(actionTimeStart) && StringUtils.isNotBlank(actionTimeEnd)){
hql.append(" and actionTime between :actionTimeStart and :actionTimeEnd");
}
hql.append(" order by actionTime desc");
System.out.println(hql);
Query query = createQuery(hql.toString());
if(StringUtils.isNotBlank(checkItemIntervalId)){
query.setString("checkItemIntervalId", checkItemIntervalId);
}
if(StringUtils.isNotBlank(actionResult)){
query.setString("actionResult", actionResult);
}
DateUtils dateUtils = new DateUtils("yyyy-MM-dd");
if(StringUtils.isNotBlank(actionTimeStart) && StringUtils.isBlank(actionTimeEnd)){
query.setDate("actionTimeStart", dateUtils.string2Date(actionTimeStart));
}
if(StringUtils.isBlank(actionTimeStart) && StringUtils.isNotBlank(actionTimeEnd)){
query.setDate("actionTimeEnd", dateUtils.string2Date(actionTimeEnd));
}
if(StringUtils.isNotBlank(actionTimeStart) && StringUtils.isNotBlank(actionTimeEnd)){
query.setDate("actionTimeStart", dateUtils.string2Date(actionTimeStart));
query.setDate("actionTimeEnd", dateUtils.string2Date(actionTimeEnd));
}
lists=query.list();
}
return lists;
}
如果必须选择HQL来进行过滤的话,大伙是如何操作的呢?
评论
kaneg
2008-06-08
为什么不用criteria?
dmewy
2008-06-04
这是spring提供的find方法,如果方法中定义了5个需要传入的参数,但是实际传入的values的length会小于5个,而且这个find代码中是通过序号来传入参数的,条件过滤是由用户在界面上选择输入的,当用户只输入其中几个过滤条件时,传入的参数序号不就不一致了吗?[/quote]
推荐你好好看看spring的HibernateTemplate这个类的find方法.
你定义的怎么可能和实际传入的不一样?
你自己写的代码会判断一下是否为空再append and xx = yy .
用spring的你就不需要判断了?
推荐你好好看看spring的HibernateTemplate这个类的find方法.
你定义的怎么可能和实际传入的不一样?
你自己写的代码会判断一下是否为空再append and xx = yy .
用spring的你就不需要判断了?
jakexu2008
2008-06-04
dmewy 写道
你这个是最简单的逻辑问题.
第一个Query query = createQuery(hql.toString());
的时候你根本就没加占位符,当然会报你未定义参数了.
第二个的话.你用spring管理hibernate的话就很好解决了.
只需要判断一次.spirng提供的find方法可以传入很多类型的.
Object[] ,POJO. 都可以.
第一个Query query = createQuery(hql.toString());
的时候你根本就没加占位符,当然会报你未定义参数了.
第二个的话.你用spring管理hibernate的话就很好解决了.
只需要判断一次.spirng提供的find方法可以传入很多类型的.
Object[] ,POJO. 都可以.
public List find(final String queryString, final Object[] values) throws DataAccessException {
return (List) execute(new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException {
Query queryObject = session.createQuery(queryString);
prepareQuery(queryObject);
if (values != null) {
for (int i = 0; i < values.length; i++) {
queryObject.setParameter(i, values[i]);
}
}
return queryObject.list();
}
}, true);
}
这是spring提供的find方法,如果方法中定义了5个需要传入的参数,但是实际传入的values的length会小于5个,而且这个find代码中是通过序号来传入参数的,条件过滤是由用户在界面上选择输入的,当用户只输入其中几个过滤条件时,传入的参数序号不就不一致了吗?
dmewy
2008-06-04
你这个是最简单的逻辑问题.
第一个Query query = createQuery(hql.toString());
的时候你根本就没加占位符,当然会报你未定义参数了.
第二个的话.你用spring管理hibernate的话就很好解决了.
只需要判断一次.spirng提供的find方法可以传入很多类型的.
Object[] ,POJO. 都可以.
第一个Query query = createQuery(hql.toString());
的时候你根本就没加占位符,当然会报你未定义参数了.
第二个的话.你用spring管理hibernate的话就很好解决了.
只需要判断一次.spirng提供的find方法可以传入很多类型的.
Object[] ,POJO. 都可以.
yujiang
2008-06-03
Query是一个接口,可以随便Proxy一个,收集所有的setXX调用.
等hql生成好之后,一起应用到真正的Query实例上.
其实就是用几个回调函数代替直接的方法调用.
等hql生成好之后,一起应用到真正的Query实例上.
其实就是用几个回调函数代替直接的方法调用.
发表评论
提醒: 该博客已发表在公共论坛,博客所有留言会成为论坛回贴,留言请注意遵守论坛发贴规则
- 浏览: 239 次
- 性别:

- 来自: 上海

- 详细资料
搜索本博客
最近加入圈子
最新评论
-
struts2的校验框架有问题 ...
wing929 写道验证文件名称错了!
-- by liran_email@163.com -
struts2的校验框架有问题 ...
遇到了跟楼主一样的问题,我的错误是xml中<field name="××× ...
-- by halk -
struts2的校验框架有问题 ...
struts2 验证? 根本不用那么麻烦,在js中直接判断就完了, if(用户 ...
-- by happy002 -
struts2的校验框架有问题 ...
freepig 和 kingyee 说得对,因为spring创建bean时,默认 ...
-- by NicholasBugs -
struts2的校验框架有问题 ...
在Spring的配置文件中修改:scope=“prototype”或者singl ...
-- by kingyee






评论排行榜