解决Java JPA Es索引时间戳字符串格式比较问题

说明:
在Java开发中常见使用 yyyy-MM-dd HH:mm:ss 来格式化时间戳
例如:
            @ApiModelProperty("订单开始日期")
            @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
            @JSONField(format = "yyyy-MM-dd HH:mm:ss")
            @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
            private Date date;
但是这种对象在Es存储时会被存储为字符串,从而无法在Es进行时间戳比较等过滤统计等。
方案一
网上采用的方案多是Java采用LocalDate或者LocalDateTime 格式声明为yyyy-MM-dd'T'HH:mm:ss:SSS'Z',然后再修改对应Es索引的对应字段的mapping

此方案因为项目中存量对象带时间戳的过多,且修改mapping的部署成本相对较大。特别实在带有基类create_time和update_time的时候,不可能每个索引都去修改,
所以直接弃用。采用了第二种取巧方案。
方案二
对每个时间字段加一个long类型的数据字段。如下图代码
    import com.alibaba.fastjson.annotation.JSONField;
    import com.fasterxml.jackson.annotation.JsonFormat;
    import com.google.common.collect.Lists;
    import java.util.Date;
    import java.util.List;
    import javax.persistence.MappedSuperclass;
    import lombok.Data;
    import org.springframework.data.annotation.Id;
    import org.springframework.data.domain.Sort;
    import org.springframework.data.elasticsearch.annotations.Field;
    import org.springframework.data.elasticsearch.annotations.FieldTyp    e;
    import org.springframework.format.annotation.DateTimeFormat;
    
    /**
     * 基础索引字段
     *
     * @author liting
     * @version 1.0
     * @date 11:20 2021/1/11
     */
    @Data
    @MappedSuperclass
    public class BaseSearchPo {
    
      @Id private Long id;
    
      @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
      @JSONField(format = "yyyy-MM-dd HH:mm:ss")
      @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
      private Date ctdTime;
    
      @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
      @JSONField(format = "yyyy-MM-dd HH:mm:ss")
      @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
      private Date updTime;
    
      @Field(type = FieldType.Long)
      private Long ctdTimeStamp;
    
      @Field(type = FieldType.Long)
      private Long updTimeStamp;
    
      public static Sort BASE_SORT;
    
      static {
        List<Sort.Order> sortOrders =
            Lists.newArrayList(
                new Sort.Order(Sort.Direction.DESC, "updTimeStamp"),
                new Sort.Order(Sort.Direction.DESC, "ctdTimeStamp"));
        BASE_SORT = Sort.by(sortOrders);
      }
    
      public void setCtdTime(Date ctdTime) {
        this.ctdTime = ctdTime;
        if (this.ctdTime != null) {
          this.ctdTimeStamp = this.ctdTime.getTime();
        }
      }
    
      public void setUpdTime(Date updTime) {
        this.updTime = updTime;
        if (this.updTime != null) {
          this.updTimeStamp = this.updTime.getTime();
        }
      }
    }
之后在数据比较时筛选时,通过long类型的时间戳字段去比较计算。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我的孤独与美酒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值