如何为日期范围的between子句编写hql查询?

时间:2014-09-09 06:54:42

标签: java mysql sql hibernate

我正在写一个hql查询,它检索特定日期之间的特定车辆的细节,我有这样的方法。

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    Session session = HibernateSession.getHibernateSession();

    // Starting Transaction
    Transaction transaction = session.beginTransaction();
    String hql = null;
    //ArrayList<HistoryLatitudeBean> vehicleHistoryList= new ArrayList<HistoryLatitudeBean>();
      try {
          DateFormat df = new SimpleDateFormat("yyyy/mm/dd");
          Date frmDate= df.parse("2014/01/01");
          Date toDate=df.parse("2014/09/01");


          hql= "from HistoryLatitudeBean where vehicleno=:vehicleno and rdate BETWEEN :frmdate and :todate";
          Query query =session.createQuery(hql);
            query.setParameter("vehicleno", 12);
            query.setParameter("frmdate", frmDate);
            query.setParameter("todate", toDate);
            List<HistoryLatitudeBean> groupList = (List<HistoryLatitudeBean>)query.list();

             for(HistoryLatitudeBean arr : groupList){
                 System.out.println(arr.getLat());   
                }


             transaction.commit();
      }
      catch(Exception e){
          if (transaction!=null) transaction.rollback();
          e.printStackTrace();
      }
      finally{session.close();}
} 

这是我的bean类

@Entity
@Table(name="hlatlng")
public class HistoryLatitudeBean {

@Id
@Column(name="vehicleno")
private int vehicleno;
@Column(name="lat")
private String lat;
@Column(name="lng")
private String lng;
@Column(name="status")
private String status;
@Column(name="rdate")
private Date rdate;
@Column(name="rtime")
private Date rtime;

//getter and setters

}

我在mysql命令行中执行的查询相同,我得到了11行,但是在java方法中,我没有得到任何行。

在Mysql db中我正在尝试查询

select * from hlatlng where vehicleno=12 and rdate BETWEEN '2014/01/01' and '2014/09/01'

我没有得到如何通过hibernate传递日期格式。我的上述方法有什么不对,任何人都可以告诉我。它真的很有帮助。

7 个答案:

答案 0 :(得分:1)

我不记得为什么但是对于约会,Hibernate要求你使用这个结构:

query.setParameter("frmdate", frmDate, Hibernate.DATE);
query.setParameter("todate", toDate, Hibernate.DATE);

我只使用Calendar对象和Hibernate.CALENDAR,因此您可能需要调整确切的类型。

答案 1 :(得分:0)

Date类不存储格式。 这里:

        query.setParameter("frmdate", frmDate);
        query.setParameter("todate", toDate);

您必须使用SimpleDateFormat格式化日期。

        query.setParameter("frmdate", df.format(frmDate));
        query.setParameter("todate", df.format(toDate));

答案 2 :(得分:0)

使用

query.setTimestamp("fromdate",frmDate);
query.setTimestamp("todate",toDate);

答案 3 :(得分:0)

mysql以yyyy-mm-dd格式存储日期。 例如2014-09-09 所以在查询之前将这样的日期转换成这样。

答案 4 :(得分:0)

你可以使用

 select * from hlatlng where vehicleno=12 and (rdate >= '2014/01/01' and rdate <='2014/09/01')

此类查询可能对您有所帮助。

答案 5 :(得分:0)

我总是更喜欢HQL的标准

    criteria.add(Restrictions.ge("rdate ", sDate)); 
    criteria.add(Restrictions.lt("rdate ", eDate));`

或者您可以使用

    criteria.add(Restrictions.between("rdate ", sDate, eDate));

答案 6 :(得分:0)

Raghu问题的答案:

  1. 将frmDate和toDate更改为字符串: String frmDate =“2014/01/01”; String toDate =“2014/09/01”;

  2. 在查询中格式化相同格式的rdate:to_char(rdate,'yyyy / mm / dd')

  3. 这里的关键是HQL可以将字符串日期输入用于日期比较。

    这适用于Groovy:
    '$ {frmDate}'和'$ {toDate}'之间的to_char(rdate,'yyyy / mm / dd')