spring boot参数为日期的查询

1,508 阅读3分钟

前言

早先做参数传递实验的时候忽略了日期类型,导致要用的时候踩坑不断。因为是学习笔记的关系,所以里面都只是截取关键的代码进行记录。

准备阶段

因为要用到@JsonFormat注解和工具类DateUtils,所以先在pom.xml中添加相关包的依赖:

<dependency>
	<groupId>com.fasterxml.jackson.core</groupId>
	<artifactId>jackson-annotations</artifactId>
	<version>2.9.6</version>
</dependency>

<dependency>
	<groupId>org.apache.commons</groupId>
	<artifactId>commons-lang3</artifactId>
	<version>3.8.1</version>
</dependency>

我们平时建项目的时候,最好是建带Maven的项目。这样我们在用到本地没有的包的时候,只需要在pom.xml文件中添加一句依赖就可以了,否则就需要自己到网上去下载再手动导入。添加依赖可以理解为在项目中导入相关的包,可以为了我们节省大量的开发时间。

核心部分

1. Entity层

在实体类的日期属性上,我们需要加上@JsonFormat注解,利用它的pattern属性来进行时间的格式化,利用timezone属性来解决时差问题。“GMT+8”表示我们在东八区,不然我们收到前端传来的时间有可能相差8个小时。

@Column(name = "drop_date")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date dropDate;

2. dao层

不得不说,这个自动生成SQL语句是真的方便,不仅日期类型也能操作(好吧,数据库中存在的字段类型都可以),还不会因为数据库的不同而出现问题(支持跨平台)。 至于生成SQL语句的规则,再挂一波文档:官方文档

public interface MessageRepository extends JpaRepository<MessageAlarmRecord, Long> {
	// where dropDate <= startDate
    public List<Message> findByDropDateLessThanEqual(Date startDate); 
    // where dropDate >= startDate
    public List<Message> findByDropDateGreaterThanEqual(Date statDate);
    // where startDate <= dropDate and dropDate <= endDate
    public List<Message> findByDropDateBetween(Date startDate, Date endDate);  
    //功能同上,可以用And关键字来进行其他查询条件的拼接
    public List<Message> findByDropDateGreaterThanEqualAndDropDateLessThanEqual(Date startDate, Date endDate);
}

3. controller层

以为到这里就没什么问题了,其实坑才刚开始……

  1. 不能用Date类型直接去接参数,必须先用String类对象去接到参数 ,然后再用DateUtils的pasteDate函数将其转换为Date类对象。
  2. 因为实体类中包含日期属性,所以在添加数据的时候也不能直接用实体类去获取前端传过来的参数
  3. 一般做项目的时候需要规定前端以什么方式给后端传参,比如说json、form表单,url等,因为不同的传参方式会对应不同的注解。

本次是以json方式传参,这里用@RequestBody + Map接收前端传过来的键值对。里面用到的DateUtils.parseDate()函数的第一个参数是表示时间的字符串,第二个参数是时间的格式(详情可以参照SimpleDateFormat类时间格式的写法)。

    @RequestMapping(path = "/find3")
    public List<Message> findBetween(@RequestBody Map<String, Object> params) {
        Date startDate = null;
        Date endDate = null;
        try {
        	//第一个参数是表示时间的字符串,第二个参数是时间的格式
            startDate = DateUtils.parseDate((String)params.get("startDate"), "yyyy-MM-dd HH:mm:ss");
            endDate = DateUtils.parseDate((String)params.get("endDate"), "yyyy-MM-dd HH:mm:ss");
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return marRepository.findByDropDateBetween(startDate, endDate);
    }

测试时传递的数据:

{
     "startDate":"2019-05-23 14:35:12",
     "endDate":"2019-08-12 11:02:00"
}

参考资料

  1. www.sojson.com/blog/246.ht… (关于@JsonFormat)
  2. blog.csdn.net/yaomingyang… (关于DateUtils,凑合看)