Jpa 时间段间的查询问题解决办法
最近在做法院的一个档案管理项目,一直做的的查询是基于compass 的索引查询、检索,今天客户说要做一个一天之内的数据统计功能,并且这个数据时要天天打印出来,作为工作考核的,我也和大意,就按照“2010-05-24”到“2010-05-27”这样直接在数据库中查询,结果有数据,也没有仔细看,拿到客户那里,客户一实验,结果是什么数据也没有查到,我还不信,我说我测试的时候有数据的,怎么拿过来就没有任何数据了呢?奇怪。我过去一测试,果真数据什么也没有,还在怀疑数据库中是不是没有数据,结果,客户说自己今天就著录并且归档了部分数据,怎么可能没有呢?真实羞人的很,回来路上就想着,是怎么回事呢?自己写的代码没有错啊?后来仔细分析了原因,每次自己测试时候都是跨天测试的,结果是有数据,但是不是这天的数据,而是昨天的数据,这是由于使用的Jpa ——hibernate 实现,同步数据库的,JAP的时间格式使用SimpleDateFormat("yyyy-MM-dd")个格式之后,还是在数据库中“yyyy-MM-dd HH:mm:ss”保存的,后来改成前台代码以“yyyy-MM-dd”字符串格式传入,后台做一下处理。
?
/** * 档案类型是不能缺少的 归档部门是可以缺省的 保管期限是不能缺省的 密级是可以缺省的 */@Overridepublic QueryResult<LawsuitArchive> queryAllLawsuitArchiveStatistics(Type_Archive archive, Type_PigeonholeDepartment department, Type_KeepTime keepTime, Type_SecretLevel secretLevel, String startTime, String endTime) {Date startDate = null;Date endDate = null;SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");StringBuffer wherejpql = new StringBuffer("");wherejpql.append(" o.pigeonholeTime >?1 and o.pigeonholeTime <?2 and o.type_Archive.type_ArchiveID=?3 ");Object queryParams[] = new Object[3];if (department != null && secretLevel == null) {// 密级是所有密级的,归档部门是不为空的wherejpql.append(" and o.type_PigeonholeDepartment.type_PigeonholeDepartmentID=?4 ");queryParams = new Object[4];queryParams[3] = new Integer(department.getType_PigeonholeDepartmentID());} else if (department == null && secretLevel != null) {wherejpql.append(" and ( o.justVolumeSecretLevel.type_SecretLevelID=?4 or o.subsidiaryVolumeSecretLevel.type_SecretLevelID=?5 )");queryParams = new Object[5];queryParams[3] = new Integer(secretLevel.getType_SecretLevelID());queryParams[4] = new Integer(secretLevel.getType_SecretLevelID());} else if (department != null && secretLevel != null) {wherejpql.append(" and o.type_PigeonholeDepartment.type_PigeonholeDepartmentID=?4 ");wherejpql.append(" and ( o.justVolumeSecretLevel.type_SecretLevelID=?5 or o.subsidiaryVolumeSecretLevel.type_SecretLevelID=?6 )");queryParams = new Object[6];queryParams[3] = new Integer(department.getType_PigeonholeDepartmentID());queryParams[4] = new Integer(secretLevel.getType_SecretLevelID());queryParams[5] = new Integer(secretLevel.getType_SecretLevelID());}try {startDate = sdf.parse(startTime.trim() + " 00:00:00");endDate = sdf.parse(endTime.trim() + " 23:59:59");} catch (ParseException e) {e.printStackTrace();}queryParams[0] = startDate;queryParams[1] = endDate;queryParams[2] = new Integer(archive.getType_ArchiveID());if (keepTime != null) {wherejpql.append(" and o.type_KeepTime.type_KeepTimeID=" + keepTime.getType_KeepTimeID());log.info("保管期限:" + keepTime.getType_KeepTime());} else if (null == keepTime) {log.info("所有保管期限........");}log.info("JPQL查询语句:" + wherejpql.toString());return lawsuitArchiveDao.queryAllLawsuitArchive(LawsuitArchive.class, -1, -1, wherejpql.toString(), queryParams, null);}
?正是让人长见识了。