Использование @UpdateTimestamp не работает и ошибка при использовании CURRENT_TIMESTAMP в запросе - PullRequest
1 голос
/ 13 января 2020

Я использую Spring и JPA и создаю запрос на обновление. Обновляется правильно. Но я также хочу обновить текущее время.

Изначально хотел просто использовать @UpdateTimestamp над полем timestamp. Это не выбрасывает ошибки. Обновление происходит для других столбцов, но без изменения в отметке времени.

Код следующий:

Сущность

@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. Пожалуйста, совет, хорошо с решением для любого сценария ios. Спасибо.

Ошибка

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

ОБНОВЛЕНИЕ:

Вернулись к использованию пометки метки времени в классе сущностей следующим образом:

@UpdateTimestamp
@Column(name = "CREAT_TS")
private Timestamp createdTimestamp;

Вместо написания пользовательского запроса, используя команду сохранения в выполнить обновление, как указано в комментариях.

@Transactional
public void myMethod(SomeClass someClass, String name) {  
    MyEntity myEntity = myRepository.findById(someClass); // works
    myEntity.setName("david");
    myRepository.save(myEntity);
}

Если поле имени myEntity для этой сущности уже называется «Дэвид», ничего не происходит, ошибок нет, обновлений нет. Если «david» - это новое имя (скажем, ранее имя было Dan), обновляется только отметка времени, но имя остается как «david». Кто-нибудь может увидеть, что я здесь делаю неправильно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...