首页 > 解决方案 > 查询错误结果 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;
}

标签: mysqlspring-bootjpa

解决方案


据我到目前为止所了解的,您正在java.util.date您的实体和存储库中使用。请确保您已使用 注释您的实体中的日期字段@Temporal(TemporalType.Date)

另外,我假设您的 java 版本是 8 或更高。如果是这种情况,那么值得java.time.LocalDate一试。:)

希望这会有所帮助!

编辑:我今天尝试使用本地设置。虽然我无法复制您的具体问题,但是当我在调试模式下运行代码时,我有一些观察结果 -

  1. MySQL 的连接 URL 需要时区信息serverTimezone=UTC。当我没有提供此信息时,它在服务器启动时给了我异常。

  2. 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.Datejava.time.LocalDateController、Service、Entity 和 Repository。另外,我@Temporal(TemporalType.Date)从我的实体中删除了。这次在调试中只选择了日期。

**您能否尝试java.time.LocalDate在您的代码中使用并分享结果。另外,请按照我在评论部分中提到的那样对您的实体进行更改!**

PS - 这可能无法完全解决您的问题,但肯定有助于进一步调试。


推荐阅读