Spring data jpa,原生查询Hibernate异常

Posted

技术标签:

【中文标题】Spring data jpa,原生查询Hibernate异常【英文标题】:Spring data jpa, native query Hibernate exception 【发布时间】:2017-04-21 14:47:27 【问题描述】:

我想删除一天前的记录,我在 Spring data JPA 中使用 SQL 查询,如下所示:

@Query(value = "delete from tableName data where data.CREATION_DATE < TRUNC(SYSDATE) - 1", nativeQuery = true)
    void deleteRecordsOlderThanYesterday();

我遇到了异常:

原因:org.springframework.orm.jpa.JpaSystemException:无法提取结果集元数据 原因:org.hibernate.HibernateException:无法提取结果集元数据

原因:java.sql.SQLSyntaxErrorException: ORA-00900: 无效的 SQL 语句

上面的代码有什么问题,或者在 HQL 中有没有其他方法可以做到这一点?

请告诉我。

【问题讨论】:

【参考方案1】:

每当您从 SQL 语句(UPDATE、DELETE)定义查询时,您都需要使用@Modifying 注释(来自org.springframework.data.jpa.repository)。试试这个:

@Modifying
@Query(value = "delete from tableName data where data.CREATION_DATE < TRUNC(SYSDATE) - 1", 
        nativeQuery = true)
void deleteRecordsOlderThanYesterday();

【讨论】:

@infiniteRefactor...谢谢你的回答,我认为你是对的,在我的系统上检查你的答案后我会接受你的答案【参考方案2】:

你最好使用 JpaRepository 并使用 findByStartDateBefore 而你不需要使用@Query

 public List<yourResult> findByStartDateBefore(Date date);

更多信息可以查看spring dochttp://docs.spring.io/spring-data/jpa/docs/1.3.4.RELEASE/reference/html/jpa.repositories.html

还有这个问题Object Recovery via a date with spring data

【讨论】:

你好 Azzabi,我可以使用 deleteByCreationDateBefore 删除,谢谢

以上是关于Spring data jpa,原生查询Hibernate异常的主要内容,如果未能解决你的问题,请参考以下文章

Spring Data JPA原生SQL查询

Spring Data JPA 原生查询结果实体

Spring data jpa,原生查询Hibernate异常

spring data jpa原生查询中基于地图索引的查询

Spring data JPA,复杂原生Query

Spring Data JPA 之 原生SQL使用