java.util.Calendar.MONTH和Oracle数据库MONTH函数之间的差异
我想通过JPA从Oracle数据库中选择实体,方法如下:java.util.Calendar.MONTH和Oracle数据库MONTH函数之间的差异,java,database,oracle,jpa,Java,Database,Oracle,Jpa,我想通过JPA从Oracle数据库中选择实体,方法如下: Calendar cal = Calendar.getInstance(); cal.setTime(anOtherDate); Query q = super.getEntityManager() .createQuery("select t from MyTable as t where extract(month from t.myDate) = :month") .setParam
Calendar cal = Calendar.getInstance();
cal.setTime(anOtherDate);
Query q = super.getEntityManager()
.createQuery("select t from MyTable as t
where extract(month from t.myDate) = :month")
.setParameter("month", cal.get(Calendar.MONTH));
但是Java和Oracle数据库的月数不同
有没有一种“更干净”的方法可以做到这一点:
cal.get(Calendar.MONTH)+1
?既然您仍然依赖于本机SQL,为什么不从DB的sysdate
中提取月份进行比较呢?除了@Ray answer之外,还应该使用DB的系统日期,比如
Query q = super.getEntityManager()
.createQuery("select t from MyTable as t
where extract(month from t.myDate) =
SQL('(SELECT extract(month from SYSDATE) FROM DUAL)')
");
“extract”不是有效的JPQL函数。“函数”是您调用随机SQL本机函数的方式。您可以使用更好的日期/时间API:java 8中的java.time,或Joda time…
cal.get(Calendar.MONTH)+1
不是问题,如果您使用的是Calendar
同意nos,它会变得“干净”。当前解决方案有什么不干净的地方?其功能和技术正确;Calendar返回一个从零开始的月份,所以要使它在数据库的范围内(从1开始),必须将它增加1。什么是不干净的?这是特定于供应商的,不是标准的JPA。对不起,我的示例不好。实际上,我不使用cal.setTime(newdate())代码>但校准设置时间(另一个日期)代码>@BnJ-Ray不是这个意思。您不需要将java日期传递给sql server,而是应该在查询中使用db server的系统日期。是的,谢谢,但我想选择实体,而不是当前月份的实体,而是任意月份的实体。@BnJ Calendar是基于月份的0
。请注意,仅用月份检索记录,而不考虑年??“SQL”不是一个有效的JPQL构造。使用createNativeQuery并使用SQL direct(或使用JPA 2.1“函数”)@NeilStockton请参阅此链接@WundwinBorn我指的是JPA,而不是将用户与特定实现联系在一起的供应商规范;使用这样的东西会有危险,特别是当有JPA标准的方法时