繁体   English   中英

Spring boot jpa query can't update field

[英]Spring boot jpa query can't update field

我在此表上有一个关于 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);

现在我有这个错误.QueryExecutionRequestException: Not supported for DML operations [UPDATE com.pxprox.entities.PackEntity with root cause...

为什么不创建一个为您执行此操作的方法? 初始化实体并更新所有内容,更改将在事务结束时自动刷新。 您可以查看使用 spring-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);
}

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

@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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM