我正在使用Spring和JPA并构造一个更新查询。它正确更新。但我也想将时间更新为当前时间戳。
最初只是想在timestamp字段上使用@UpdateTimestamp。它不会抛出任何错误。更新发生在其他列上,但时间戳没有变化。
代码如下:
实体
@Getter
@Setter
@Entity
@AllArgsConstructor
@NoArgsConstructor
public class MyEntity {
@EmbeddedId
private SomeClass someClass;
@Column("name")
private String name;
@MapsId("number")
@ManyToOne(cascade = CascadeType.MERGE)
@JoinColumn(name = "NUMBER")
private NumEntity numEntity;
// this annotation makes no diff and date does not change
@UpdateTimestamp
@Column(name = "CREAT_TS")
private Timestamp createdTimestamp;
}
回购
@Repository
public interface MyRepository extends CrudRepository<MyEntity, SomeClass> {
@Modifying
@Query("UPDATE MyEntity e SET e.name =:name WHERE e.someClass.id =:id")
void updt(@Param("id") int id, @Param("name") String name);
}
进行更新的方法
@Transactional
public void myMethod(int id, String name) {
myRepository.updt(id, name);
}
或者,我尝试如下在查询本身中更新时间戳。当我尝试运行myMethod时,这将引发错误。请提出建议,可以使用这两种方案的解决方案。谢谢。
错误
CAUSE = InvalidDataAccessResourceUsageException:命名参数不正确绑定:CURRENT_TIMESTAMP;嵌套异常为org.hibernate.QueryException:命名参数未绑定:CURRENT_TIMESTAMP
使用查询中的当前时间戳回购。
@Repository
public interface MyRepository extends CrudRepository<MyEntity, SomeClass> {
@Modifying
@Query("UPDATE MyEntity e SET e.createdTimestamp =:CURRENT_TIMESTAMP, e.name =:name WHERE e.someClass.id =:id")
void updt(@Param("id") int id, @Param("name") String name);
}