hql中怎么查询时间段?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hql中怎么查询时间段?相关的知识,希望对你有一定的参考价值。

有一个实体类File,其中包含一个类型为Date(java.util.Date)的upload属性,现在我想查询某一个时间段内发表的一些File,
查询方法是这样的:
public List<File> findByTime(Date startTime,Date endTime)
Session session = sessionFactory.getCurrentSession();
String hql = "from File where uploadTime between ? and ? ";
Query query = session.createQuery(hql);
query.setDate(0, startTime);
query.setDate(1,endTime );
List<File> files = query.list();
// System.out.println();
if(files.size()==0)
return null;

return files;

无论如何,查出来的files的size都是0,为什么?能否有简单的解决方法?

我研究了网上很多关于HQL带有时间(date)条件的查询,基本都行不通,我试了一种书写方法,结果可以运行通过Java环境:
hql =" from C1 where datetime=to_date(' "+time+" ', 'YYYY-mm-dd') " ;time为前台传来的时间型的字符串,可以运行通过。网上有一种先转换的SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd"); 然后再f.prase(time),需要抛异常,不好用。这是我凭借Oracle的经验做成功的。
参考技术A String hql = "from File where uploadTime between ? and ? ";
Query query = session.createQuery(hql);
query.setDate(0, startTime);
query.setDate(1,endTime );
这几句是没有问题的,请检查hibernate生成的语句,根据语句排查下错误吧
参考技术B query.setParameter(0, startTime);
query.setParameter(1, endTime);
这样就可以了

hibernate用HQL查询集合属性

Hibernate查询时遇到要获取一整个集合关联属性时怎么用HQL和Query类查询?如果不行应该怎么做?假如需要返回下图中content的List怎么写?

参考技术A hql="selects.id,s.name,t.id,t.namefromUsers,Useraddresstwheret.id=s.id"这条sql里面的User和Useraddress是两个实体类,现在组合查询分别取出来两个实体类里面的两个字段,然后我想再建立一个实体类Result,里面定义这四个结果集里面的字段,能不能执行完这条hql,正好把这个结果集对应到实体类Result里面呢,Result这个实体类,没写映射文件Result.hbm.xml.希望能帮下忙2种做法创建一个classtemp有属性sid,name,tid,sname,tname创建一个构造函数publictemp(sid,name,tid,sname,tname)1.hql中Listselectnewtemp(s.id,s.name,t.id,t.name)fromUsers,Useraddresstwheret.id=s.id2.List记录的每一行是object[]遍历object[0]==s.idobject[1]==s.nameobject[2]==t.idobject[3]==t.name感谢glamey兄弟的文章,正好解决了当前遇到的问题。原文链接如下:/blog/721019假设我们现在有一个DTO,其属性包括两张表的属性,我们现在需要将sql语句查询得到的内容转为一个DTO对象,其解决方法如下:Stringsql="selectu.userNameasuserName,p.titleastitle,p.addTimeasaddTimefromuserasu,postaspwhereu.id=p.userId"Queryq=factory.getCurrentSession().createSQLQuery(sql).setResultTransformer(Transformers.aliasToBean(PostVO.class));上面select中as后面的内容必须和PostVO中属性名一致,这样就可以返回一个针对PostVO的一个集合。其实大家可以看下hibernate这一部分的源码就会发现,主要是使用了AliasToBeanResultTransformer这个类,通过sql的查询,会返回数组,然后hibernate根据数据表的映射,自动帮我们来set对应的字段属性,所以标红的部分务必要跟VO中的属性值一直,要不然会报错的。如果需要的话,大家也可以重写这个类。例如VOResultTransformer。然后在dao中更改成:setResultTransformer(newVOResultTransformer(PostVO.class));另外,除了以上glamey的方法外,还有一种方法:Queryq=session.createQuery("selectnewcom.hibernate.MsgInfo(m.id,m.cont,m.topic.title,m.topic.category.name)fromMsgm");Listlist=q.list();其中,MsgInfo是DTO。值得注意的是,第二种方法中DTO必须提供带参数的构造方法,并且HQL语句中属性的位置要与构造方法中的位置一一对应。

以上是关于hql中怎么查询时间段?的主要内容,如果未能解决你的问题,请参考以下文章

hibernate怎么用查询

hibernate用HQL查询集合属性

关于spring data 中CrudRepository 查询 怎么写@query中hql语句

hibernate 一对多update操作的hql语句怎么写?

hibernate hql语句怎么在查询时区分大小写?

sql语句和hql语句的区别?