JpaRepository不支持DML操作[删除查询]

时间:2017-05-17 10:19:23

标签: java spring hibernate spring-data-jpa hql

我在扩展JPaRepository的界面中编写了一个删除某些对象的查询,但是当我执行查询时它会抛出异常! 任何人都可以为我解释并提前感谢你:)

查询:

HTTP/1.1 200 OK
X-Powered-By: Servlet/3.1
Content-Disposition: attachment; filename="20170517191000051.zip"
Content-Length: 1016
Content-Transfer-Encoding: binary
Content-Type: application/octet-stream
Date: Wed, 17 May 2017 10:10:51 GMT

binary data

我收到了这个错误,请不要请为我解释一下,谢谢大家:)

例外:

public interface LimitRepository extends JpaRepository<CLimit, Long> {

  @Query("delete from CLimit l where l.trader.id =:#{#trader.id}")
  void deleteLimitsByTrader(@Param("trader") CTrader trader);

}

5 个答案:

答案 0 :(得分:90)

试试这个:

const getAllAnalysis => (user) => dispatch => {
  let url = APIEndpoints["getAnalysis"];
  const request = axios.get(url)
      .then(response => disptach({
         type:GET_ANALYSIS,
         payload: response.data
      }));
}

每当您尝试修改db中的记录时,您必须将其标记为@Transactional以及@Modifying,它指示Spring可以修改现有记录。
存储库方法必须为void或异常不断被抛出。

答案 1 :(得分:22)

我有同样的问题,我试过@afridi的答案,这个答案很好,但据我所知,做法不好。您不应在存储库类中使用@Transactional注释,而应使用服务(和实现)类。请找到以下答案。

  

LimitServiceImpl.java

import org.springframework.transaction.annotation.Transactional;
...
@Override
@Transactional
public void deleteLimitsByTrader(CTrader trader) {
// here im calling the LimitRepository interface. 
 getEntityRepository().deleteLimitsByTrader(trader);
}
  

LimitRepository.java

import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
...
public interface LimitRepository extends JpaRepository<CLimit, Long> {

  @Modifying
  @Query("delete from CLimit l where l.trader.id =:#{#trader.id}")
  void deleteLimitsByTrader(@Param("trader") CTrader trader);

}

确保使用正确的导入。

答案 2 :(得分:2)

您忘记在method上方添加两个annotations

@Transactional
@Modifying

答案 3 :(得分:0)

我通过使用EntityManager.createQuery("your deleteStatement").executeUpdate();

解决了该问题

我了解问题已经回答,但仍在发布,可能对需要解决的其他人很有帮助。

答案 4 :(得分:0)

添加@Transactional(org.springframework.transaction.annotation.Transactional) 和@Modifying(org.springframework.data.jpa.repository.Modifying) 为我解决了类似的问题