gpt4 book ai didi

java - Hibernate Criteria 从日期中提取年份

转载 作者:搜寻专家 更新时间:2023-10-30 19:53:43 29 4
gpt4 key购买 nike

我正在创建一个 hibernate 条件,用于检查契约(Contract)在一年内是否有效。契约(Contract)将开始日期和结束日期作为标准日期字段。

所以习惯了 SQL-SERVER,我会想到这个 SQL 中的一些内容:

SELECT * FROM CONTRACT WHERE YEAR(startDate) <= ? AND YEAR(endDate) >= ?

问号是整数形式的给定年份。

那么如何将其转换为 hibernate 条件呢?

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));

如您所见,我遗漏了将日期转换为年份以便进行比较的部分。当然,我的代码不会按原样运行。

关于如何获得预期结果的任何建议?

最佳答案

似乎 API 不直接支持您想要的功能,但您可以考虑使用变通方法。

解决方案一:

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();
}

两种方法的示例输出:

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

解决方案 2:

DetachedCriteria criteria = DetachedCriteria.forClass(Contract.class)
.add(Restrictions.sqlRestriction("YEAR(startDate) >= ? ", year,Hibernate.INTEGER))
.add(Restrictions.sqlRestriction("YEAR(endDate) <= ? ", year,Hibernate.INTEGER));

关于java - Hibernate Criteria 从日期中提取年份,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10470502/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com