Springboot Data-JPA findByDate()

时间:2019-05-24 11:00:22

标签: java hibernate spring-boot spring-data-jpa

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

我尝试使用jpa-repository中的springboot data-jpa和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的数据时,我还注意到了一个小问题:日期似乎提前了2h(例如:现在是11:57,但是在mysql工作台软件中,它显示9:57,当我查询服务器时间时,它显示了irght tme ...) 我实际上并不在乎我只想检索今天的记录的小时/分钟/秒。

3 个答案:

答案 0 :(得分:0)

尝试该解决方案是否对您有帮助-> date-only-comparison-without-time-using-jpa-named-query

基本上,尝试使用@Temporal(TemporalType.DATE)代替@Temporal(TemporalType.TIMESTAMP)

否则,您可以编写使用sql函数仅匹配日期部分而不匹配时间的自定义查询-> comparing-dates-in-mysql-ignoring-time-portion

答案 1 :(得分:0)

我认为,您应该在所有位置从java.util.Date切换到java.sql.Date。 有两种方法可以在两者之间进行转换。

尽管我更喜欢逻辑之间而不是findByDate。逻辑之间将更加准确。

java.sql.Date JavaDoc,

  

围绕毫秒值的精简包装器,它使JDBC能够识别   这是一个SQL DATE值。毫秒值代表数字   自1970年1月1日00:00:00.000以来经过的毫秒数   格林威治标准时间。

     

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

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

  

Date类表示特定时间点,以毫秒为单位   精度。

答案 2 :(得分:0)

我找到了解决我问题的可行方法,显然,在使用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()函数,在这里提供了帮助,因为与我为搜索提供的日期进行比较时,它仅考虑了时间戳的日期部分。 有了这个,我可以搜索比较日期的数据,同时保留时间戳类型(以显示小时,分钟,秒..) 感谢您的帮助。