我正在写一个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传递日期格式。我的上述方法有什么不对,任何人都可以告诉我。它真的很有帮助。
答案 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问题的答案:
将frmDate和toDate更改为字符串: String frmDate =“2014/01/01”; String toDate =“2014/09/01”;
在查询中格式化相同格式的rdate:to_char(rdate,'yyyy / mm / dd')
这里的关键是HQL可以将字符串日期输入用于日期比较。
这适用于Groovy:
'$ {frmDate}'和'$ {toDate}'之间的to_char(rdate,'yyyy / mm / dd')