mysql - 查询错误结果 JPA Spring Boot
问题描述
我有一个问题,@Query
数据库没有让我得到正确的结果。
在 WorkBench 中使用此查询:SELECT * FROM Table WHERE FECHA_INICIO >= '2020-02-01' AND FECHA_FIN <= '2020-02-28'
,总共返回 18 个结果。
但是使用我的 JAVA 代码,它只显示 6 条记录,它们是列FECHA_INICIO
中具有的记录,2020-02-01
并且FECHA_FIN
列中它们具有 value 2020-02-28
。任何这些列中的日期不对应于该月的最后一天或第一天的记录,不显示它们。那就是问题所在。
这是来自存储库的我的 JAVA 代码:
public interface TableRepository extends CrudRepository<Table, String> {
@Query(value = "SELECT * FROM Table WHERE FECHA_INICIO >= :fechaInicio AND FECHA_FIN <= :fechaFin", nativeQuery = true)
List<Table> findAllBetweenDates(@Param("fechaInicio") Date fechaInicio, @Param("fechaFin") Date fechaFin);
}
我试图查看代码正在执行什么查询,但在日志中它只向我显示以下内容:
org.hibernate.SQL.logStatement - SELECT * FROM TABLE WHERE FECHA_INICIO >= ? AND FECHA_FIN <= ?
数据库中的两列都是 Date 类型。添加此代码,如果它适用于我在 PostgreSQL 中的数据库副本中,但在 MySQL 中,它只显示 6 条记录而不是 18 条记录。知道会发生什么吗?
编辑:
这是我的实体类:
@Entity
@Table(name = "Table")
public class Table{
@Id
@Column(name = "ID", length = 20)
@NotNull
private String id;
@Column(name = "FECHA_INICIO")
@Temporal(TemporalType.DATE)
@NotNull
private Date fechaInicio;
@Column(name = "FECHA_FIN")
@Temporal(TemporalType.DATE)
@NotNull
private Date fechaFin;
@Column(name = "DESCRIPTION", length = 20)
@NotNull
private String descripcion;
}
解决方案
据我到目前为止所了解的,您正在java.util.date
您的实体和存储库中使用。请确保您已使用 注释您的实体中的日期字段@Temporal(TemporalType.Date)
。
另外,我假设您的 java 版本是 8 或更高。如果是这种情况,那么值得java.time.LocalDate
一试。:)
希望这会有所帮助!
编辑:我今天尝试使用本地设置。虽然我无法复制您的具体问题,但是当我在调试模式下运行代码时,我有一些观察结果 -
MySQL 的连接 URL 需要时区信息
serverTimezone=UTC
。当我没有提供此信息时,它在服务器启动时给了我异常。在
java.util.Date
控制器中,请求被解析为时区。因此,对于下面显示的控制器,如果我使用 startDate=2019-01-01 它转换为 2019 年 1 月 1 日 05:30IST,即它有我的本地时区信息。@GettMapping(value = "/test") public List<Test> getResult( @RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate startDate, @RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate endDate) { List<Test> result = testService.getResult(startDate, endDate); return result; }
基于以上观察,我觉得问题可能是因为选择了时区。
此后,我更改java.util.Date
为java.time.LocalDate
Controller、Service、Entity 和 Repository。另外,我@Temporal(TemporalType.Date)
从我的实体中删除了。这次在调试中只选择了日期。
**您能否尝试java.time.LocalDate
在您的代码中使用并分享结果。另外,请按照我在评论部分中提到的那样对您的实体进行更改!**
PS - 这可能无法完全解决您的问题,但肯定有助于进一步调试。
推荐阅读
- build - 构建 conda 配方时如何修复 conda“ResolvePackageNotFound”
- python - Python 对象作为属性类型
- macos - 将 lat/lng 添加到图像以便 Finder/Photos/Lightroom 识别位置?
- c++ - 为什么复制构造函数不是微不足道的,只是因为有一个用户定义的析构函数?
- android - 实现 Searchbar 到 firebase recyclerview 来搜索节点 android studio
- python - 将 pandas 数据框(开始日期、结束日期)重塑为每日和每小时列
- android - 在 AlertDialog 中的 TaskCompletionSource 上设置结果时出错
- c++ - 如何检查变量是否派生自类?
- c++ - 在 winapi CALLBACK 函数上返回 FALSE 时出现意外行为(循环被跳过?)
- database - MariaDB 可以支持的最大记录数