Hibernate JPA 实体只想保留一列

Hibernate JPA Entity want to persisit only one column

请建议我一种更新 JPA 实体中一列的方法。 我的代码

@Entity
@Table(name = "my_table")
public class MyTable {



@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", updatable = false)
private Integer id;



@Column(name = "name")
private String name;



@Column(name = "mobile")
private Integer mobile;

@Column(name = "address")
private String address;

@Column(name = "gender")
private String gender;
}

当我想更新我的实体时,它会更新所有列,但只想更新一列

MyTable myTable = myRepo.findMyTableById(1);

myTable.setName("ra");

repo.save();

在这种情况下查询打印

update Account set name=?, mobile=?, address=?, gender=? where id=?

但我只想更新一列值,为什么要更新所有列?

您可以在实体 class 中使用 @DynamicUpdate 注释。这将帮助您只更新一列 实际上,当我们在实体上使用 @DynamicUpdate 时,Hibernate 不会使用缓存的 SQL 语句进行更新。相反,它会在我们每次更新实体时生成一条 SQL 语句。此生成的 SQL 仅包含更改的列。

为了找出更改的列,Hibernate 需要跟踪当前实体的状态。因此,当我们更改实体的任何字段时,它会比较实体的当前状态和修改后的状态。 所以,我希望这会在您的控制台上打印出来。

update my_table set name=? where id=?

Ref Tutorial

默认行为是当您更新 Hibernate 实体时,实体上的 所有 字段将在基础数据库记录中更新。请注意,这并没有错,假设用于更新列的值与最初读取的值相同。

如果您真的只想更新单个列,您可以为此创建一个 JPA 存储库方法,例如

@Modifying
@Query("update MyTable m set m.name = :name where m.id = :id")
void updateName(@Param("name") String name, @Param("id") Long id);

如果您检查上面生成的 SQL,它实际上只会更新一列。

请注意,在某些数据库中,对值未更改的列的更新实际上会被忽略、q.v。 .