当前位置: 首页 > 知识库问答 >
问题:

Spring boot jpa查询无法更新字段

漆雕奇
2023-03-14

我在这个表上有一个关于hibernate的更新查询

class PackEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String status;
    private String oldStatus;
    @ManyToOne
    @JoinColumn(name = "order_id")
    private OrderEntity order;
    ...
}

在OrderEntity上,当我有机器名时,我与另一个表有另一个关系。

在JPA存储库中,我有一个查询。基本上,首先我按机器和状态搜索,然后我想更新旧状态以输入状态字段的当前值,然后输入状态以输入新状态。就是这样:

@Transactional
@Modifying(clearAutomatically = true)
@Query("UPDATE PackEntity p " +
        "SET p.oldStatus= p.status, p.status = ?3 " +
        "WHERE p.id IN " +
        "     ( SELECT p2" +
        "       FROM PackEntity p2" +
        "       JOIN p2.order " +
        "       JOIN p2.order.machine" +
        "       WHERE p2.order.machine.name = ?1 AND p2.status = ?2)")
List<PackEntity > updateAllWithStatusByMachineNameAndStatus(String machineName, String status, String newStatus);

现在我有这个错误。QueryExfigtionRequestException:不支持DML操作[UPDATEcom.pxprox.entities.PackEntity与根原因...

共有2个答案

葛驰
2023-03-14

方法的返回类型是错误的,查询也应该稍微适应一下。使用以下内容:

@Transactional
@Modifying(clearAutomatically = true)
@Query("UPDATE PackEntity p " +
        "SET p.oldStatus = p.status, p.status = ?3 " +
        "WHERE EXISTS " +
        "     ( SELECT 1" +
        "       FROM PackEntity p2" +
        "       JOIN p2.order o " +
        "       JOIN o.machine m" +
        "       WHERE m.name = ?1 AND p2.status = ?2 AND p2.id = p.id)")
void updateAllWithStatusByMachineNameAndStatus(String machineName, String status, String newStatus);

甚至更好

@Transactional
@Modifying(clearAutomatically = true)
@Query("UPDATE PackEntity p " +
        "SET p.oldStatus = p.status, p.status = ?3 " +
        "WHERE p.status = ?2 AND EXISTS " +
        "     ( SELECT 1" +
        "       FROM p.order o " +
        "       JOIN o.machine m" +
        "       WHERE m.name = ?1)")
void updateAllWithStatusByMachineNameAndStatus(String machineName, String status, String newStatus);
施俊哲
2023-03-14

为什么不创建一个方法来为你做这件事呢?初始化实体并更新所有内容,更改将在事务结束时自动刷新。你可以看看用spill-data-jpa更新实体

基本上应该是这样的:

@Autowired
private PackEntityRepository packEntityRepository;

public void updatePackEntity(PackEntity newPE) {
    PackEntity packEntity = packEntityRepository.findById(newPE.getId());
    packEntity.setOldStatus = packEntity.getStatus();
    packEntity.setStatus = newPE.getStatus();
    packEntityRepository.save(packEntity);
}
 类似资料:
  • OTA更新查询与下载 获取access_token 终端设备 终端设备直接接入OTA服务器应当使用Client Credentials模式,client_id为设备id,client_serect为设备令牌. App接入 如果终端设备无法直接接入OTA服务器,而通过App中转,那么App应当也使用Client Credentials模式,client_id为app_id,client_secret

  • 以下示例将演示如何使用Update查询,在DBUtils的帮助下更新记录。 我们将更新表中的记录。 语法 其中, updateQuery − 更新包含占位符的查询。 queryRunner − QueryRunner对象更新数据库中的员工对象。 为了理解上述与DBUtils相关的概念,我们编写一个将运行更新查询的示例。创建一个示例应用程序。 更新在DBUtils入门应用中创建的文件。 编译并运行应

  • 问题内容: 我有一个包含三列的表: 还有另一个表,其中包含2列。的列与的相同。 我需要一个查询,它将更新带有的列。 我可以通过检查ID并执行更新语句来通过循环来实现。如何才能通过查询完成? 问题答案: 怎么样

  • 问题内容: 谁能看到以下查询出了什么问题? 当我运行它时,我得到: #1064-您的SQL语法有误;检查与您的MySQL服务器版本相对应的手册以获取正确的语法,以在第8行的’a where a.CompetitionID = Competition.CompetitionID’附近使用 问题答案: 主要问题是内部查询不能与外部语句上的子句相关,因为在内部子查询执行之前,where过滤器首先应用于要

  • 这是我在mongo的文档: 我需要更新内部房间阵列中的对象。我尝试了一个选择匹配元素的查询没有语法错误,但出现了一个错误: “errmsg”:“字段“calendar.0.rooms.0.price”必须是数组,但在文档{u id:ObjectId('5cd26a886458720f7a66a3b8')中为字符串类型”, 这是我的疑问: 这是我在StackOverflow中找到的一些参考,但没有帮

  • 问题内容: 谁能帮助我了解为什么此更新查询未更新数据库中的字段?我在我的php页面中有这个来从数据库中检索当前值: 这是我的HTML表单: 这是我的“ editblogscript”: 我不明白为什么它不起作用。 问题答案: 您必须在查询中的所有VARCHAR内容周围加上单引号。因此,您的更新查询应为: 同样,用POST中的内容直接更新数据库是一种不好的形式。您应该使用mysql_real_esc