【问题标题】:Update query spring data JPA modifies all columns更新查询spring数据JPA修改所有列
【发布时间】:2020-03-29 01:31:34
【问题描述】:

我正在尝试根据用户从 UI 传递的 Id 更新表格。

问题陈述示例:当用户将 Id 发送为 1 时,表应仅使用其他几个参数(如 lastModifiedBy)更新一行,并在我的代码更新表中的所有行时删除,

orm.xml

<entity class="com.example.Domain" name="Domain">
    <table name="t_table"/>
    <attributes>
        <id name="id">
            <column name="ID" nullable="false"/>
            <generated-value strategy="SEQUENCE" generator="S_GEN"/>
            <sequence-generator name="S_GEN" sequence-name="S_GEN" allocation-size="1"/>
        </id>
        <basic name="deleted">
            <column name="DELETED" nullable="false" length="5"/>
        </basic>
        <basic name="lastModifiedBy">
            <column name="LAST_MODIFIED_BY" nullable="false" length="100"/>
        </basic>
    </attributes>

实体类

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Domain {
    private Long id;
    private boolean deleted;
    private String lastModifiedBy;
}

JPA 存储库:

    public interface JpaDomainRepository extends Repository<Domain, Long> {
        @Modifying
        @Query(value = "update Domain set DELETED = true, LAST_MODIFIED_BY = lastModifiedBy where id = id")
        int update(Domain domain);
}   

服务类

public void update(UpdateCommand command) {
    Domain domain = repository.findByIdAndDeletedFalse(command.getID());
    domain.setLastModifiedOn(command.getLastModifiedOn());
    domain.setLastModifiedBy(command.getLastModifiedBy());
    repository.update(domain);
}

如果表已经有多个条目并且我正在尝试更新第一行,那么其余所有行都被修改,

简而言之,对于下面的 where 子句,我的更新查询始终为真,

输入 1 的示例,只有 id = 1 的一列应该被修改,但查询也在修改第 2、3 行等等,

update Domain set DELETED = true, LAST_MODIFIED_BY = lastModifiedBy where 1= 1

为什么会这样?有什么解决办法?

PS: 我不想从服务类显式传递 ID,因为我的 id 已经在域对象中可用。

【问题讨论】:

  • 我已经在域对象中有id。 1.传递一个不使用的域对象有什么意义:为什么不简单地传递ID? 2. 你为什么要编写一个查询来进行更新而不是使用标准的 ORM 功能,在这里你可以通过继承的 save(entity) 方法使用,如果你扩展 CrudRepository 而不是 tahn Repository
  • @AlanHay 1. 拥有域对象的点是stackoverflow.com/questions/39741102/… 2. 我正在编写查询,因为我使用的是 spring-data-jpa。
  • 1.您不是编写本机查询:这是一个 JPQL 查询。 2. 拥有领域对象的意义是...... - 我认为你需要回顾一下 JPA 的一些基本概念。
  • @AlanHay 不是传递完整域对象而不是传递多个参数的好方法吗?我希望你理解我的问题陈述
  • 如果你真的在你的更新方法中使用了它。但你没有.... ;(

标签: java postgresql spring-boot java-8 spring-data-jpa


【解决方案1】:

其中 id = id 将始终为真,如果那是您使用的确切语法...您的意思是别的吗?

@Query 中的参数不应该以 ?对于索引参数和 : 对于命名参数?

   @Query(value = "update Domain set DELETED = true, LAST_MODIFIED_BY = :lastModifiedBy where id = :id")

【讨论】:

猜你喜欢
  • 2015-11-22
  • 1970-01-01
  • 1970-01-01
  • 2012-05-04
  • 2021-02-17
  • 2020-01-16
  • 2021-10-18
  • 1970-01-01
  • 2017-02-05
相关资源
最近更新 更多