<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title></title>
    <description></description>
    <link>http://jakexu2008.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>如何正确使用HQL进行查询？</title>
        <author>jakexu2008</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jakexu2008.javaeye.com">jakexu2008</a>&nbsp;
          链接：<a href="http://jakexu2008.javaeye.com/blog/199839" style="color:red;">http://jakexu2008.javaeye.com/blog/199839</a>&nbsp;
          发表时间: 2008年06月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          一开始我是这样写的，将HQL和Query参数设置通过一个判断写在一起了，但是随之而来的问题就出现了，在createQuery之后增加的参数会报未定义该参数。<br /><pre name="code" class="java">
	public List&lt;CheckItemIntervalResult> query(Map&lt;String,String> filterMap){
		List&lt;CheckItemIntervalResult> lists = new ArrayList&lt;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 &lt;= :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;
	}
</pre><br /><br /><span style="color: red">有一种方法可以解决，就是将hql和query设置参数进行分开，但是需要判断两次，太繁琐了，如下： 大家有什么好的建议吗？</span><br /><br /><pre name="code" class="java">
	public List&lt;CheckItemIntervalResult> query(Map&lt;String,String> filterMap){
		List&lt;CheckItemIntervalResult> lists = new ArrayList&lt;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 &lt;= :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;
	}
</pre><br /><br />如果必须选择HQL来进行过滤的话，大伙是如何操作的呢？
          <br/>
          <span style="color:red;">
            <a href="http://jakexu2008.javaeye.com/blog/199839#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 03 Jun 2008 19:07:29 +0800</pubDate>
        <link>http://jakexu2008.javaeye.com/blog/199839</link>
        <guid>http://jakexu2008.javaeye.com/blog/199839</guid>
      </item>
      <item>
        <title>struts2的校验框架有问题还是我的代码有问题？</title>
        <author>jakexu2008</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jakexu2008.javaeye.com">jakexu2008</a>&nbsp;
          链接：<a href="http://jakexu2008.javaeye.com/blog/190941" style="color:red;">http://jakexu2008.javaeye.com/blog/190941</a>&nbsp;
          发表时间: 2008年05月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          问题是这样的，我在struts2的项目中，添加了validation的xml验证框架，自己认为自己的代码是没有问题的，也在网上搜了很多资料，有很多也遇到过像我一样的问题，都是都没有最后解决，以下是我的代码和配置文件，请大家帮忙看看到底是struts2的validation的bug，还是是我的代码或配置文件错了呢<br /><br /><br /><span style="color: red">UserAction</span><br /><pre name="code" class="java">
public class UserAction extends ActionSupport{
	private static final long serialVersionUID = 1L;
	private UserDao userDao;
	private String username;
	private String password;
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public void setUserDao(UserDao userDao) {
		this.userDao = userDao;
	}
	public String login() throws Exception {
		if (userDao.login(username, password)) {
			return SUCCESS;
		} else {
			return INPUT;
		}
	}
}
</pre><br /><span style="color: red">UserDao</span><br /><pre name="code" class="java">
public class UserDao extends HibernateEntityExtendDao&lt;User> {
	public boolean login(String username,String password){
		if(username==null)
			return false;
		if(username.equals("11")){
			return true;
		}else{
			return false;
		}
	}
}
</pre><br /><span style="color: red">struts.xml</span><br /><pre name="code" class="java">
&lt;struts>
	&lt;constant name="struts.custom.i18n.resources" value="i18n.messageResource" />
	&lt;constant name="struts.enable.DynamicMethodInvocation" value="true" />
	&lt;constant name="struts.devMode" value="true" />
	&lt;package name="default" extends="struts-default">
		&lt;action name="UserLogin" class="userAction"  method="login">
			&lt;result name="success">/index.jsp&lt;/result>
			&lt;result name="input">/login.jsp&lt;/result>
		&lt;/action>
	&lt;/package>
&lt;/struts>
</pre><br /><span style="color: blue">补充：userAction和userDao都已经在springbean中定义</span><br /><span style="color: red">UserAction-UserLogin-validation.xml</span><br /><pre name="code" class="java">
&lt;validators>
	&lt;field name="username">
		&lt;field-validator type="requiredstring">
			&lt;message>000&lt;/message>
		&lt;/field-validator>
	&lt;/field>
	&lt;field name="password">
		&lt;field-validator type="requiredstring">
			&lt;message>22&lt;/message>
		&lt;/field-validator>
	&lt;/field>
&lt;/validators>
</pre><br /><span style="color: red">JSP</span><br /><pre name="code" class="java">
	&lt;body>
		&lt;center>
			&lt;table>
				&lt;tr>
					&lt;td>
						&lt;s:form action="UserLogin!login">
							&lt;s:textfield name="username" label="%{getText('login.username')}" />
							&lt;s:textfield name="password" label="%{getText('login.password')}" />
							&lt;s:submit value="%{getText('login.btnSubmit')}" />
						&lt;/s:form>
					&lt;/td>
				&lt;/tr>
			&lt;/table>
		&lt;/center>
	&lt;/body>
</pre><br /><br />在jsp中我使用的是服务器端认证，所以理论上来说，不论用户的用户名是否输对，都应该会去执行UserAction的login方法，但是事实上，并没有去执行，而是直接验证失败，在页面上显示验证失败的信息了。很奇怪，也很郁闷。因为如果我把UserAction-UserLogin-validation.xml从actin包中移除的话，其他配置和代码都不改，这样程序中提交的时候，就可以跳入UserAction的login方法， 这到底是为什么呢？ 为什么加了这个校验文件之后，就无法执行action了？？
          <br/>
          <span style="color:red;">
            <a href="http://jakexu2008.javaeye.com/blog/190941#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 08 May 2008 10:34:12 +0800</pubDate>
        <link>http://jakexu2008.javaeye.com/blog/190941</link>
        <guid>http://jakexu2008.javaeye.com/blog/190941</guid>
      </item>
  </channel>
</rss>