首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

怎么正确使用HQL进行查询

2012-11-04 
如何正确使用HQL进行查询?一开始我是这样写的,将HQL和Query参数设置通过一个判断写在一起了,但是随之而来

如何正确使用HQL进行查询?
一开始我是这样写的,将HQL和Query参数设置通过一个判断写在一起了,但是随之而来的问题就出现了,在createQuery之后增加的参数会报未定义该参数。

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来进行过滤的话,大伙是如何操作的呢?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代码中是通过序号来传入参数的,条件过滤是由用户在界面上选择输入的,当用户只输入其中几个过滤条件时,传入的参数序号不就不一致了吗? 4 楼 dmewy 2008-06-04   这是spring提供的find方法,如果方法中定义了5个需要传入的参数,但是实际传入的values的length会小于5个,而且这个find代码中是通过序号来传入参数的,条件过滤是由用户在界面上选择输入的,当用户只输入其中几个过滤条件时,传入的参数序号不就不一致了吗?

推荐你好好看看spring的HibernateTemplate这个类的find方法.
你定义的怎么可能和实际传入的不一样?
你自己写的代码会判断一下是否为空再append   and xx = yy .
用spring的你就不需要判断了?







5 楼 kaneg 2008-06-08   为什么不用criteria?

热点排行