有一个小问题让我无法摆脱;
目前我正在做一个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
,我宁愿这样做,但我不认为这将工作,因为它不可能查询“日期范围”,如果值是字符串?
1条答案
按热度按时间xzv2uavs1#
最佳选择是修改数据库中的表,并对列使用适当的数据类型。如果是日期,则将其设置为日期。
接下来最好的方法是使用数据库并在比较之前将字符串转换为日期,这意味着您需要编写一个自定义SQL查询来获得结果,而不是使用Spring Data JPA的自动功能。
这应该会给您提供所需的结果,但是可能会比较慢,因为对于每一行,都需要将字符串转换为日期。