最近需要用到Hibernate操作Oracle,要先排序再取第一条。
hibernate的HQL不支持Oracle的先排序再取第一条,于是要用原生的SQL。
public ProductMonitore findBySubCodeAndBeforeTime(String productSubCode, Date now) {
String sql = "select ID,PRODUCTSUBCODE,EXPECTTIME from (select * from IDATA_NM.BMP_PRODUCTMONITORE where PRODUCTSUBCODE=:p1 and EXPECTTIME<=:p2 order by EXPECTTIME desc) where rownum <= 1";
List<Object[]> list = this.findBySql(sql);
if(list!=null && list.size()>0){
Object[] obj = list.get(0);
ProductMonitore p = new ProductMonitore();
p.setId(Integer.parseInt(obj[0].toString));
p.setProductSubCode(obj[1].toString))
p.setExpectTime(obj[2])
System.out.println(obj[2]);
return p;
} else {
return null;
}
}
sql中EXPECTTIME字段在数据库中为日期类型(如:2019-05-08 17:26:30)。
按理说System.out.println(obj[2]);应该输出2019-05-08 17:26:30,但实际上只输出了2019-05-08。
网上搜了好多,只找到一条可信的:
造成这个现象的原因是使用的oracle10g的驱动ojdbc14.jar造成的。如果使用9i或者11g的驱动则没有这个问题。
查看了下项目,确实是ojdbc14.jar。
但是项目架构不是我能决定的,有没有大神解决啊?
我的方法是先用SQL查出需要的那条数据的id,然后再用HQL根据id查出具体的数据
public ProductMonitore findBySubCodeAndBeforeTime(String productSubCode, Date now) {
//先用原生SQL排序后取第一条。因为后边需要用到日期型数据,ojdbc14-10.2.0.1.0.jar原生SQL取日期型数据会丢失时分秒。
String sql = "select ID from (select ID from IDATA_NM.BMP_PRODUCTMONITORE where PRODUCTSUBCODE=:p1 and expectTime<=:p2 order by EXPECTTIME desc) where rownum <= 1";
List<Object> ids = this.findBySql(sql, new Parameter(productSubCode, now));
if(ids!=null && ids.size()>0){
Integer id = Integer.parseInt(ids.get(0).toString());
//先用HQL查出具体的ProductMonitore
String hql = "from ProductMonitore where id=:p1";
List<ProductMonitore> list = this.find(hql, new Parameter(id));
return list.get(0);
} else {
return null;
}
}