在写JPA自定义插入sql的时候报错。网上查了好多,但都是没什么可行的办法。大都是说:
执行create,update,insert的sql语句应该用statement的execute()方法,如果用的是statement的executeQuery()就会出现上诉问题
但在JPA中这也不怎么好找。。。。。
最后,找到了解决的办法:
@Transactional
@Modifying
@Query(nativeQuery = true,value = "insert into catalog_tree(catalog_name,parent_id,level) values(?1,?2,?3)")
int insertCatalog(String cataLogName,Integer parentId,Integer level);
没错!! 添加事务注解 @Transactional和@Modifying。完美解决。
然后顺着这个问题,去查了下@Modifying这个注解的作用:
(1)可以通过自定义的 JPQL 完成 UPDATE 和 DELETE 操作。
注意: JPQL 不支持使用 INSERT;
(2)在 @Query 注解中编写 JPQL 语句, 但必须使用 @Modifying 进行修饰. 以通知 SpringData, 这是一个 UPDATE 或 DELETE 操作
(3)UPDATE 或 DELETE 操作需要使用事务,此时需要定义 Service 层,在 Service 层的方法上添加事务操作;
(4)默认情况下, SpringData 的每个方法上有事务, 但都是一个只读事务。
他们不能完成修改操作。
感觉对这个问题很有针对性。还有**,这个JPA原生语句,对于插入,更新,删除都必须加上@Modifying注解才不会报错!**