繁体   English   中英

Springboot data-jpa findByDate()

[英]Springboot data-jpa findByDate()

我正在尝试从mysql数据库中检索Today的记录。

我尝试使用springboot data-jpa和jpa-repository中的findByDate(Date date,Pageable pageable)方法,它总是返回空结果。

这是创建的实体代码:

@Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="id_synop")
    private Long id;

    @Column(name="contenu")
    private String contenu;

    @Column(name="date", columnDefinition="TIMESTAMP(0)")
    @Temporal(TemporalType.TIMESTAMP)
    private Date date;

    @ManyToOne(cascade= {CascadeType.DETACH,CascadeType.MERGE,CascadeType.PERSIST,CascadeType.REFRESH},
            fetch=FetchType.LAZY)
    @JoinColumn(name="id_station")
    @JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
    private Station station;

这是使用Mysql WorkBench创建的Mysql表:

CREATE TABLE `synop` (
  `id_synop` bigint(20) NOT NULL AUTO_INCREMENT,
  `id_station` bigint(20) NOT NULL,
  `contenu` varchar(255) NOT NULL,
  `date` timestamp NOT NULL,
  PRIMARY KEY (`id_synop`),
  UNIQUE KEY `idmsgsynop_UNIQUE` (`id_synop`),
  KEY `fk_synope_station_idx` (`id_station`),
  CONSTRAINT `fk_synope_station` FOREIGN KEY (`id_station`) REFERENCES `station` (`id_station`)
) ENGINE=InnoDB AUTO_INCREMENT=25 DEFAULT CHARSET=utf8;

jpa存储库代码:

import java.util.Date;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;

public interface SynopRepository extends JpaRepository<Synop, Long> {
    public Page<Synop> findByStationId(Long stationId, Pageable pageable);

    public Page<Synop> findByDate(Date date, Pageable pageable);
}

和控制器代码:

@GetMapping("/synops-today")
    public Page<Synop> findToday(@RequestParam(defaultValue="1") int page,Pageable pageable) {
        return synopRepository.findByDate(new Date(),PageRequest.of(page-1, 10, Sort.by("date").ascending()));
    }

我希望通过使用findByDate(...)方法获得今天的记录,但它似乎不起作用。 我还注意到从MysqlWorkbench查看数据时出现了一些问题:日期似乎提前2小时(例如:现在它是11:57但是在mysql workbench软件中它显示为9:57,当我查询服务器时间时它显示了不正确的时间虽然...)我实际上并不关心我想要检索今天记录的小时/分钟/秒。

尝试此解决方案可以帮助您 - > date-only-comparison-without-time-using-jpa-named-query

基本上,尝试使用@Temporal(TemporalType.DATE)而不是@Temporal(TemporalType.TIMESTAMP)

如果没有那么你可以编写自定义查询,它使用sql函数来匹配日期部分而不是时间 - > 比较日期在mysql-ignoring-time-portion

我想,您应该在所有地方从java.util.Date切换到java.sql.Date 有两种方法可以转换。

虽然我更喜欢逻辑而不是findByDate。 逻辑之间会更准确。

java.sql.Date JavaDoc,

一个围绕毫秒值的瘦包装器,允许JDBC将其标识为SQL DATE值。 毫秒值表示自1970年1月1日00:00:00.000 GMT以来经过的毫秒数。

为了符合SQL DATE的定义,java.sql.Date实例包含的毫秒值必须通过在与实例关联的特定时区中将小时,分钟,秒和毫秒设置为零来“标准化”。 。

java.util.Date JavaDoc - 这个JavaDoc很长但相关部分,

Date类表示特定的时刻,精度为毫秒。

我为我的问题找到了一个有效的解决方案,显然当使用TIMESTAMP数据类型时,JPA-Data“findByDate()”方法无法开箱即用。 我实际上需要通过比较时间戳的日期部分来查找记录,所以我使用了这样的查询注释:

@Query("from Synop s where DATE(s.date) = :date")
public Page<Synop> findByDate(@Param("date") Date date, Pageable pageable);

这是sql DATE()函数,它在这里有所帮助,因为在将它与我为搜索提供的日期进行比较时,它只考虑时间戳的日期部分。 有了这个,我可以搜索比较日期的数据,同时保持时间戳类型(显示小时,分钟,秒......)感谢您的帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM