Jpa 时间段间的查询有关问题解决方法

Jpa 时间段间的查询问题解决办法

最近在做法院的一个档案管理项目,一直做的的查询是基于compass 的索引查询、检索,今天客户说要做一个一天之内的数据统计功能,并且这个数据时要天天打印出来,作为工作考核的,我也和大意,就按照“2010-05-24”到“2010-05-27”这样直接在数据库中查询,结果有数据,也没有仔细看,拿到客户那里,客户一实验,结果是什么数据也没有查到,我还不信,我说我测试的时候有数据的,怎么拿过来就没有任何数据了呢?奇怪。我过去一测试,果真数据什么也没有,还在怀疑数据库中是不是没有数据,结果,客户说自己今天就著录并且归档了部分数据,怎么可能没有呢?真实羞人的很,回来路上就想着,是怎么回事呢?自己写的代码没有错啊?后来仔细分析了原因,每次自己测试时候都是跨天测试的,结果是有数据,但是不是这天的数据,而是昨天的数据,这是由于使用的Jpa ——hibernate 实现,同步数据库的,JAP的时间格式使用SimpleDateFormat("yyyy-MM-dd")个格式之后,还是在数据库中“yyyy-MM-dd HH:mm:ss”保存的,后来改成前台代码以“yyyy-MM-dd”字符串格式传入,后台做一下处理。

 

/**
	 * 档案类型是不能缺少的 归档部门是可以缺省的 保管期限是不能缺省的 密级是可以缺省的
	 */
	@Override
	public 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);
	}

 正是让人长见识了。