使用多个where子句在spring数据jpa中删除

Posted

技术标签:

【中文标题】使用多个where子句在spring数据jpa中删除【英文标题】:Delete in spring data jpa with multiple where clause 【发布时间】:2018-07-09 06:49:38 【问题描述】:

我想从 mysql 表中删除记录。

我在扩展 JpaRepositoy 的接口中编写的查询是。

@Modifying
@Transactional
@Query(value="DELETE FROM tablename WHERE end_date>=?1 and username=?2 and start_date <=?3)
void deleteByStart_dateAndUsernameAndEnd_date(Date start_date,String username,Date end_date);

我想传递小于或等于 end_date 且 end_date 大于或等于 start_date 的 start_date

我遇到了以下异常:

org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.hql.internal.QueryExecutionRequestException: Not supported for DML operations [delete from com.poc.pa.model.tablename where end_date>=?1 and username=?2 and start_date <=?3]; nested exception is java.lang.IllegalStateException: org.hibernate.hql.internal.QueryExecutionRequestException: Not supported for DML operations [delete from com.poc.pa.model.tablename where end_date>=?1 and username=?2 and start_date <=?3]

任何帮助将不胜感激。

【问题讨论】:

我正在尝试使用上述查询执行删除操作。我想传递小于或等于 end_date 且 end_date 大于或等于 start_date 的 start_date 。 对不起,我的评论无关紧要, 因为它是一个 DML 语句,它似乎有写入操作的问题(根据异常消息)。您能否检查一下您是否有正确的导入:org.springframework.transaction.annotation.Transactional 和 org.springframework.data.jpa.repository.Modifying。您还可以检查您提到的连接到数据库的凭据是否应该在数据库上具有写入权限 【参考方案1】:

我假设删除语句是一个 SQL 查询。因此,您必须在 Query 注释中声明这一点。只需添加 nativeQuery = true

@Transactional    
@Modifying
@Query(value="DELETE FROM tablename WHERE end_date>=?1 and username=?2 and start_date <=?3, 
    nativeQuery = true)
void deleteByStart_dateAndUsernameAndEnd_date(Date start_date,String username,Date end_date);

【讨论】:

以上是关于使用多个where子句在spring数据jpa中删除的主要内容,如果未能解决你的问题,请参考以下文章

如何使用条件(where子句)更新实体并在spring数据jpa中的方法响应中获取更新的实体

使用JPA在Sql中具有不同值的多个语句where子句

Spring数据JPA findFirst用where子句(过滤)和order by,抛出内部异常

如何使用 Hibernate 为 Spring data JPA 的所有查找方法添加全局 where 子句?

JPA标准WHERE子句

Spring JPA Hibernate JPQL 查找在 where 子句中传递的项目的索引