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

更新查询spring data JPA修改所有列

凤扬
2023-03-14

我试图根据用户从UI传递的Id更新表。

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

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

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

例如,对于输入1,只有id=1的一列应该得到modify,但是query也在修改行2、3等等,

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

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

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

共有1个答案

仉臻
2023-03-14

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

@query中的参数不应该在前面加?对于索引参数和:对于命名参数?

   @Query(value = "update Domain set DELETED = true, LAST_MODIFIED_BY = :lastModifiedBy where id = :id")
 类似资料:
  • OTA更新查询与下载 获取access_token 终端设备 终端设备直接接入OTA服务器应当使用Client Credentials模式,client_id为设备id,client_serect为设备令牌. App接入 如果终端设备无法直接接入OTA服务器,而通过App中转,那么App应当也使用Client Credentials模式,client_id为app_id,client_secret

  • 当使用修改查询时,我有一个问题,EntityManager在查询执行后包含过时的实体。 假设我们在DB中有电子邮件[ID=1,active=true,expire=2015/01/01]。 执行后:

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

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

  • 我目前正在使用Azure Cosmos DB,我正在尝试使用SQL查询更新容器中存在的所有项的属性,但我得到了一个错误,该错误显示“语法错误,不正确的语法靠近‘更新’”。有人能帮我吗?我想知道我是做错了还是Azure Cosmos SQL不支持“更新”功能。我使用的SQL查询是: 提前感谢!!!

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