Spring Boot MySQL 'Date'对象实际上是字符串

8oomwypt  于 2023-03-02  发布在  Spring
关注(0)|答案(1)|浏览(175)

有一个小问题让我无法摆脱;
目前我正在做一个Springboot项目,我希望从UI中获取两个日期(开始日期和结束日期),在控制器中处理数据,并返回给定日期之间的数据列表。
我遇到的问题是数据库中的'Date'对象实际上是字符串。不幸的是,简单地将值更改为'Dates'不是一个选项(超过10,000个)条目。
我尝试了以下方法,但没有成功:
Java控制器:

//Input params format: 2023-02-27 // YYYY-MM-DD
@RequestMapping("/neteng/topten")
public Iterable<BaseData> getTopTen(
        @RequestBody Map<String, String> dates) {
    
    String startDate= dates.get("startDate");
    String endDate= dates.get("endDate");

    DateFormat sdf = new SimpleDateFormat("dd-MM-yyyy");
    
    try {
        java.util.Date date = sdf.parse(startDate);
        java.util.Date date2 = sdf.parse(endDate);
    
        java.sql.Date sqlStartDate = new java.sql.Date(date.getTime()); 
        java.sql.Date sqlEndDate = new java.sql.Date(date2.getTime()); 
    
        baseDataRepository.findBydateBetween(sqlStartDate, sqlEndDate);

        return baseDataRepository.findBydateBetween(sqlStartDate, sqlEndDate);

    } catch (ParseException e) {
        e.printStackTrace();
    }
    
    
    return "SomeErrorPage";

}

波伊:

@Entity
@Table(name="base_data")
public class BaseData {

@Id //Set primary key
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="id")//Specify the column name
private Long baseDatatableId;
private Date date; // Have tried keeping this a String
...

public BaseData() {

}

public BaseData(Date date_time, ...) {
    this.date = date_time;
    ...
}
//Getters & setters

JPA回购:

public interface BaseDataRepository extends JpaRepository<BaseData,Long>{

    List<BaseData> findBydateBetween(Date startDate, Date endDate);

}

SQL脚本示例数据片段(& S):

CREATE TABLE `base_data` (
`id` INT NOT NULL AUTO_INCREMENT,
`date` DATE DEFAULT NULL,
....
PRIMARY KEY (`id`),
KEY `Operator_idx` (`operator`)
)  ENGINE=INNODB AUTO_INCREMENT=1001 DEFAULT CHARSET=UTF8MB4 COLLATE = UTF8MB4_0900_AI_CI;

INSERT INTO `base_data`
VALUES      (1,
         '1/11/2020 17:18',
         ....)

create table语句原来的日期为varchar,我将其改为Date,因为我认为这可能会有所帮助。如果我可以得到一个解决方案,保持所有内容为String/Varchar,我宁愿这样做,但我不认为这将工作,因为它不可能查询“日期范围”,如果值是字符串?

xzv2uavs

xzv2uavs1#

最佳选择是修改数据库中的表,并对列使用适当的数据类型。如果是日期,则将其设置为日期。
接下来最好的方法是使用数据库并在比较之前将字符串转换为日期,这意味着您需要编写一个自定义SQL查询来获得结果,而不是使用Spring Data JPA的自动功能。

@Query(value="SELECT * FROM base_data WHERE STR_TO_DATE(`date`, '%m/%d/%Y %H:%i'), nativeQuery=true) BETWEEN :startDate AND :endDate")
List<BaseData> findBydateBetween(Date startDate, Date endDate);

这应该会给您提供所需的结果,但是可能会比较慢,因为对于每一行,都需要将字符串转换为日期。

相关问题