【问题标题】:spring data jpa on timestamp field for current date?当前日期的时间戳字段上的弹簧数据jpa?
【发布时间】:2019-07-16 23:21:06
【问题描述】:

我必须查询当前日期的时间戳字段并且只获得 1 条记录。 我可以这样写查询:

@Query("Select i From Log i Where i.createdBy = :userId And DATE(i.createdDate) = CURRENT_DATE")

JPA 实体:

@Entity
@Table(name = "log")
public class Log {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "log_id")
    private Long logId;

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

    @Column(name = "created_date", updatable = false)
    @Temporal(TemporalType.TIMESTAMP)
    @DateTimeFormat(style = "yyyy-MM-dd HH:mm:ss")
    private Calendar createdDate;

    //SETTERS AND GETTERS
}   

表格:

CREATE TABLE `log` (
    `log_id` BIGINT(20) NOT NULL AUTO_INCREMENT,
    `address` VARCHAR(30) NOT NULL,
    `created_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`log_id`)
)
ENGINE=InnoDB
;

这里我无法限制记录, 我知道我们可以通过发送 Pageable 来限制记录,但我必须再次从列表中获取记录。

有没有办法做到这一点? 我们如何在 spring data jpa 方法名中做到这一点?

【问题讨论】:

    标签: spring-boot jpa spring-data-jpa jpql


    【解决方案1】:

    您可以使用 Spring Data 存储库来执行此操作,如下所示:

    public interface LogRepository extends JpaRepository<Log, Long> {
    
      // just get one or null
      Log findOneByCreatedByAndCreatedDate(Instant createdBy, Instant createdDate);
    
      // get all, but pagable
      List<Log> findAllByCreatedByAndCreatedDate(Instant createdBy, Instant createdDate, Pageable pageable);
    
    }
    

    我假设您使用 Instant 作为时间戳,但这也适用于其他 Java 8 日期类型或旧的 Date 类。

    在您的业务逻辑中,您现在可以调用:

    Log log = logRepository.findOneByCreatedByAndCreatedDate(YOUR_TIMESTAMP, Instant.now());
    
    // or
    Log allLogs = logRepository.findOneByCreatedByAndCreatedDate(YOUR_TIMESTAMP, Instant.now(), PageRequest.of(0, 50));
    

    【讨论】:

    • 我想获取当前日期的记录,但该字段是时间戳。它会工作吗?
    • 得到这个异常:参数值 [2019-02-22T20:17:06.463Z] 与预期类型不匹配 [java.util.Calendar (n/a)];嵌套异常是 java.lang.IllegalArgumentException:参数值 [2019-02-22T20:17:06.463Z] 与预期类型不匹配 [java.util.Calendar (n/a)]。
    • 你能用你的 JPA 实体 Java 类和表的 DDL 脚本更新你的问题吗?
    • 我已经用实体和表格更新了问题。请检查
    • 我在您发布的原始@Query 中缺少您尝试访问的createdBy 列。我不会在实体中使用Calender 类型。替换为Instant 并删除@Temporal@DateFormat 注释
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-08
    • 2019-08-31
    • 1970-01-01
    • 1970-01-01
    • 2020-05-22
    • 2013-03-10
    • 1970-01-01
    相关资源
    最近更新 更多