我创建了一个休眠标准,用于检查合同是否在一年内有效.合同的开始日期和结束日期作为标准日期字段.
所以习惯SQL-SERVER,我会想到这个SQL的内容:
SELECT * FROM CONTRACT WHERE YEAR(startDate) <= ? AND YEAR(endDate) >= ?
Run Code Online (Sandbox Code Playgroud)
该问号是给定年份的整数.
那么如何将其转换为休眠标准呢?
int year = 2011; //Just a testyear for example purposes.
DetachedCriteria criteria = DetachedCriteria.forClass(Contract.class)
.add(Restrictions.le("startDate", year))
.add(Restrictions.ge("endDate", year));
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,我错过了将日期转换为一年的位置,因此可以进行比较.当然,我的代码不会按原样运行.
有关如何获得理想结果的任何建议?
Pau*_*Wee 14
看起来API并不直接支持您想要的内容,但您可以考虑使用解决方法.
解决方案1:
DetachedCriteria criteria = DetachedCriteria.forClass(Contract.class)
.add(Restrictions.le("startDate", toEndOfYear(year))
.add(Restrictions.ge("endDate", toStartOfYear(year)));
public Date toStartOfYear(int year) {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, year);
calendar.set(Calendar.DAY_OF_YEAR, 0);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
return calendar.getTime();
}
public Date toEndOfYear(int year) {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, year);
calendar.set(Calendar.DAY_OF_YEAR, 0);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND,-1);
return calendar.getTime();
}
Run Code Online (Sandbox Code Playgroud)
两种方法的输出示例:
System.out.println(toStartOfYear(2013));
System.out.println(toEndOfYear(2013));
Mon Dec 31 00:00:00 MYT 2012
Sun Dec 30 23:59:59 MYT 2012
Run Code Online (Sandbox Code Playgroud)
解决方案2:
DetachedCriteria criteria = DetachedCriteria.forClass(Contract.class)
.add(Restrictions.sqlRestriction("YEAR(startDate) >= ? ", year,Hibernate.INTEGER))
.add(Restrictions.sqlRestriction("YEAR(endDate) <= ? ", year,Hibernate.INTEGER));
Run Code Online (Sandbox Code Playgroud)
如果您使用JPA criteriaBuilder,则可以使用该criteriaBuilder.function
方法.例如
contractRepository.findAll(new Specification<Contract>() {
@Override
public Predicate toPredicate(Root<Contract> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
return cb.ge(cb.function("year", Integer.class, root.get(Contract_.endDate)), year);
}
});
Run Code Online (Sandbox Code Playgroud)
(我在本例中使用Spring Data Specifications来查询数据库.contractRepository
因此是类型JpaSpecificationExecutor
)
归档时间: |
|
查看次数: |
18816 次 |
最近记录: |