项目中一个成品价格表,每条记录中的价格有一个使用时间段,但是各个记录中时间段不存在交叉,
判断一段时间内的价格的算法:
数据库的价格表: productprice 列字段 开始时间点 startDate 结束时间点 endDate
查询 开始时间点 startDate0 结束时间点 endDate0
查询使用使用算法公式:
startDate <= endDate0 and endDate>=startDate0
得到时间段的价格:
应用如下:
/**
* 分页查询时使用
*
* @param <T>
* @param paginater
* @param searchCondition
* @return
*/
public <T> Paginater<T> paginate(Paginater<T> paginater, final ProductItemPriceCondition searchCondition) {
Sorter sorter = paginater.getSorter();
if (sorter.isEmpty()) {
sorter = new Sorter().asc("p.startDate");
}
LimitedList<T> limitedList = findByQuery(new QueryCreator() {
public Query createQuery(Session session) {
DynamicQuery dynamicQuery = new DynamicQuery("select distinct p from " + searchCondition.getForTypeName() + " p where (1 = 1) ");
dynamicQuery.appendIfNotNull(" and p.startDate<=:endDate ", "endDate", searchCondition.getEndDate());
dynamicQuery.appendIfNotNull(" and p.endDate>=:startDate ", "startDate", searchCondition.getStartDate());
dynamicQuery.appendIfNotNull("and p.productId=:productId ", "productId", searchCondition.getProductId());
return dynamicQuery.build(session);
}
}, paginater.getLimit(), sorter);
return paginater.fromLimitedList(limitedList);
}