首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >作为参数传递的JPA中的日期时间表达式

作为参数传递的JPA中的日期时间表达式
EN

Stack Overflow用户
提问于 2014-12-03 00:52:14
回答 2查看 2.8K关注 0票数 0

我想比较一下JPA中的datetime函数。只是想知道怎么通过。顺便说一句,我对JPA非常陌生。我的输入日期将类似于这个28/12/2014 16:20,我将它解析为日期。

我必须将其作为参数传递,但数据库表(MS )由日期时间格式( 2014-12-28 16:20:38.107 )组成。

这是我的密码。

@Entity下(我不能编辑这段代码,因为我没有这样做的权限。无论如何,其他方法正在访问这个实体,我只是在重用它)

代码语言:javascript
复制
    @Column(name = "PublishDate", nullable = false)
    private Date publishDate;

我的实际密码

代码语言:javascript
复制
    Date date = simpleDateFormat.parse(s);
    Message.findByPublishDate(date);

在使用Debug=true运行上述代码之后,我在sql查询中看到传递的参数为:messages0_.PublishDate=?,这意味着它甚至不接受日期,我得到了下面的异常

代码语言:javascript
复制
select operations0_.OperationsMessageID as Operatio1_10_, operations0_.Content as Content2_10_, 
operations0_.CreatedDate as CreatedD3_10_, operations0_.ExpiryDate as ExpiryDa4_10_, 
operations0_.PublishDate as PublishD5_10_, operations0_.Status as Status6_10_, operations0_.Title 
as Title7_10_, operations0_.OperationsMessageTypeID as Operatio8_10_ from OperationsMessage 
operations0_ where operations0_.PublishDate=?

例外细节:

代码语言:javascript
复制
org.springframework.dao.InvalidDataAccessResourceUsageException: could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:172)
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:155)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:417)
at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:59)
at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:213)
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:147)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.data.jpa.repository.support.LockModeRepositoryPostProcessor$LockModePopulatingMethodIntercceptor.invoke(LockModeRepositoryPostProcessor.java:105)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
at com.sun.proxy.$Proxy44.findByPublishDate(Unknown Source)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-03 02:13:57

您的Spring生成的JPQL查询很有可能无法工作,因为您的列定义缺少@时态注释。规范指出,这个注释必须被指定为任何java.util.Datejava.util.Calendar类型的列。

我知道你说过你不能改变它,但我认为没有选择:

代码语言:javascript
复制
    @Temporal(TemporalType.DATE)
    @Column(name = "PublishDate", nullable = false)
    private Date publishDate;

如果物理数据库列是时间戳SQL类型,则可能需要TemporalType.TIMESTAMP。

或者,列已指定为java.sql.Date。如果是这样的话,那么也许您需要使用该日期类型作为参数到findByPublishDate,从您的java.util.Date转换:

代码语言:javascript
复制
    Message.findByPublishDate(new java.sql.Date(date.getTime()));
票数 1
EN

Stack Overflow用户

发布于 2014-12-03 01:05:26

您不需要解析日期参数,请参见下面的示例:

代码语言:javascript
复制
query.setParameter("publishDate", publishDate, TemporalType.TIMESTAMP);

您只需使用所需参数的类型来设置参数,在本例中是时间戳,因此可以使用TemporalType.TIMESTAMP。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27261812

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档