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

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

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

  1. //Input params format: 2023-02-27 // YYYY-MM-DD
  2. @RequestMapping("/neteng/topten")
  3. public Iterable<BaseData> getTopTen(
  4. @RequestBody Map<String, String> dates) {
  5. String startDate= dates.get("startDate");
  6. String endDate= dates.get("endDate");
  7. DateFormat sdf = new SimpleDateFormat("dd-MM-yyyy");
  8. try {
  9. java.util.Date date = sdf.parse(startDate);
  10. java.util.Date date2 = sdf.parse(endDate);
  11. java.sql.Date sqlStartDate = new java.sql.Date(date.getTime());
  12. java.sql.Date sqlEndDate = new java.sql.Date(date2.getTime());
  13. baseDataRepository.findBydateBetween(sqlStartDate, sqlEndDate);
  14. return baseDataRepository.findBydateBetween(sqlStartDate, sqlEndDate);
  15. } catch (ParseException e) {
  16. e.printStackTrace();
  17. }
  18. return "SomeErrorPage";
  19. }

波伊:

  1. @Entity
  2. @Table(name="base_data")
  3. public class BaseData {
  4. @Id //Set primary key
  5. @GeneratedValue(strategy = GenerationType.IDENTITY)
  6. @Column(name="id")//Specify the column name
  7. private Long baseDatatableId;
  8. private Date date; // Have tried keeping this a String
  9. ...
  10. public BaseData() {
  11. }
  12. public BaseData(Date date_time, ...) {
  13. this.date = date_time;
  14. ...
  15. }
  16. //Getters & setters

JPA回购:

  1. public interface BaseDataRepository extends JpaRepository<BaseData,Long>{
  2. List<BaseData> findBydateBetween(Date startDate, Date endDate);
  3. }

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

  1. CREATE TABLE `base_data` (
  2. `id` INT NOT NULL AUTO_INCREMENT,
  3. `date` DATE DEFAULT NULL,
  4. ....
  5. PRIMARY KEY (`id`),
  6. KEY `Operator_idx` (`operator`)
  7. ) ENGINE=INNODB AUTO_INCREMENT=1001 DEFAULT CHARSET=UTF8MB4 COLLATE = UTF8MB4_0900_AI_CI;
  8. INSERT INTO `base_data`
  9. VALUES (1,
  10. '1/11/2020 17:18',
  11. ....)

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

xzv2uavs

xzv2uavs1#

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

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

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

相关问题