Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java.util.Calendar.MONTH和Oracle数据库MONTH函数之间的差异_Java_Database_Oracle_Jpa - Fatal编程技术网

java.util.Calendar.MONTH和Oracle数据库MONTH函数之间的差异

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

我想通过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")
.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标准的方法时