【问题标题】:Spring Jpa Update: Can not issue data manipulation statements with executeQuery()Spring Jpa 更新:无法使用 executeQuery() 发出数据操作语句
【发布时间】:2018-07-09 15:43:44
【问题描述】:

我尝试使用句柄查询来更新SQL 数据库中的表。

代码:

    @Autowired
    private ProducerRepository producerRepository;

    public void update(Producer producer){

        String name = producer.getProducerName();
        long id = producer.getId();

//        producerRepository.save(producer); //this method works well.
        producerRepository.update(name, id); //handle attempt - throws exeption in this string
    }

ProducerRepository:

@Repository
    public interface ProducerRepository extends JpaRepository<Producer, Long>{

        @Query(nativeQuery = true, value = "UPDATE producer SET producer_name = :pName WHERE id = :id")
        Producer update(
                @Param("pName") String pName,
                @Param("id") long id
        );
    }

producer 实体的所有参数都正确,producerRepository.save(producer) 运行良好。 (我也在控制台 nameid 字段中 - 好吧)

所以,我可以将producer 保存在数据库中,但是,当我尝试使用update() 方法时出现错误。

无法使用 executeQuery() 发出数据操作语句


PS

控制台中的sql查询也很好用

(UPDATE producer SET producer_name = 'some name' WHERE id = ....)

应该注意,存储库中的其他 SQL 原生查询可以正常工作。所以spring/hibernate/jdbc设置是正确的。

【问题讨论】:

标签: java mysql spring spring-jdbc


【解决方案1】:

使用注解@Modifying

这将触发注释到方法的查询作为更新查询 而不是选择一个。

来自2.2.6 修改查询 https://docs.spring.io/spring-data/jpa/docs/1.3.4.RELEASE/reference/html/jpa.repositories.html

【讨论】:

    【解决方案2】:

    如果上述解决方案不起作用,请使用此

    @Modifying
        @Transactional 
        @Query(value ="delete from admindata where user_name = :userName AND group_name = :groupName",nativeQuery = true)
        public void deleteadminUser(@Param("userName") String userName,@Param("groupName") String groupName);
    

    【讨论】:

      【解决方案3】:
      @Query(nativeQuery = true, value = "UPDATE producer SET producer_name = :pName WHERE id = :id")
              Producer update(
                      @Param("pName") String pName,
                      @Param("id") long id
              );
      

      您的更新方法正在返回 Producer 对象,返回应该是 int 或 void,因为您正在返回 Producer 实体,Spring JPA 认为它必须获取对象而不是更新它,这就是它正在执行的原因executeQuery,而不是executeUpdate,还需要@Modifying注解。

      【讨论】:

        猜你喜欢
        • 2013-10-05
        • 2010-12-26
        • 2011-09-21
        • 2015-01-01
        • 2020-07-22
        • 2013-12-07
        相关资源
        最近更新 更多