【问题标题】:How to embed a date object in @Query Spring Data JPA without passing an argument in interface method如何在@Query Spring Data JPA中嵌入日期对象而不在接口方法中传递参数
【发布时间】:2017-10-13 05:16:36
【问题描述】:

我有一个扩展CrudRepository 的接口(用于spring-data-jpa 集成)。

假设我有一个方法,我想做如下的事情。

@Modifying
@Query("update UserData u set u.lastUpdatedDate = #{new Date()}, u.lastUpdatedBy = ?2, lock=true where u.userId = ?1");
public void lockUser(Long userId, User updatingUser);

现在我有两个问题

  1. 我不想在每个函数中都传递lastUpdatedDate,而是想利用SpEL 动态创建日期对象并传递。

  2. 假设我想通过在接口中使用default 函数跳过传递updatingUser 参数,Spring EL 可以支持吗?如果是怎么办?

default 函数的意思是这样的。

public interface myInterface extends CrudRepository<T,ID>{
    default UserDetails getAdminObj(){
        UserDetails systemAccount= new UserDetails();
        systemAccount.setUserID(-120);
        return systemAccount;
    }
}

提前致谢。

【问题讨论】:

    标签: spring hibernate spring-data-jpa jpql spring-el


    【解决方案1】:

    回答您的第一个问题。

    如果您想在每次更新实体时更新实体的属性,您可以使用@PreUpdate 注释。

    假设您有一个 User 实体,其中 lastUpdatedDate 作为其属性之一。

    @Entity
    public class User {
    
        ...
    
        private Date lastUpdatedDate;
    
        ...
    
        //Setters getters 
    
        @PreUpdate
        public void updatedAt() {
            this.lastUpdatedDate= new Date();
        }
    
    }
    

    使用该注释,您不必在每次更新 user 实体时显式更新 lastUpdatedDate

    还可以查看@PrePersist 注释,它可以帮助您在持久化之前自动填充实体属性。

    回答你的第二个问题

    目前这在spring-data-jpa 中是不可能的。在 JIRA 中有一个 ticket 用于此,Spring 团队仍在调查中。

    但是,如果您需要解决方法,可以查看一个简单的条件查询示例 here

    【讨论】:

      猜你喜欢
      • 2014-11-19
      • 2022-01-12
      • 2018-11-29
      • 2018-01-24
      • 2020-11-07
      • 1970-01-01
      • 2018-08-07
      • 2016-11-26
      • 2017-02-12
      相关资源
      最近更新 更多