1
votes

Springboot data-jpa findByDate ()

J'essaie de récupérer les enregistrements d'aujourd'hui à partir de la base de données mysql.

J'ai essayé d'utiliser springboot data-jpa et la méthode findByDate (Date date, Pageable pageable) de jpa-repository et elle renvoie toujours des résultats vides. p >

Voici le code d'entité créé:

@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()));
    }

et voici la table Mysql créée avec Mysql WorkBench:

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);
}

Le code du référentiel jpa:

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;

et le code du contrôleur:

@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;

J'espère obtenir les enregistrements d'aujourd'hui en utilisant le findByDate (...) méthode, mais cela ne semble pas fonctionner. J'ai également remarqué un petit problème lors de la visualisation des données de MysqlWorkbench: les dates semblent être 2h à l'avance (ex: maintenant il est 11h57 mais dans le logiciel mysql workbench, il indique 9h57, quand j'interroge l'heure du serveur, il montre le temps irght cependant ...) En fait, je ne me soucie pas des heures / minutes / secondes que je veux juste récupérer les enregistrements d'aujourd'hui.


3 commentaires

utilisez-vous mysql dialact? spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect


Essayez de changer la date de java.util.date à sql.date dans votre cntrlr ...


essayez #findByDateBetween (Date de début, Date de fin, Pageable), le début est la date d'aujourd'hui plus 00:00:00, la fin est la date d'aujourd'hui plus 24:00:00. "Les dates semblent être 2h à l'avance", c'est peut-être un problème de fuseau horaire.


3 Réponses :


0
votes

Essayez si cette solution vous aide -> date uniquement -comparaison-sans-temps-utilisant-la-requête-nommée-jpa

En gros, essayez d'utiliser @Temporal (TemporalType.DATE) au lieu de @Temporal(TemporalType.TIMESTAMP)

Sinon, vous pouvez écrire une requête personnalisée qui utilise la fonction sql pour correspondre uniquement à la partie date et non à l'heure -> comparaison-dates-dans-mysql-ignoring-time-portion


2 commentaires

Votre solution fonctionne mais j'ai besoin du type de données horodatage pour pouvoir afficher les heures de création. Si je le change en DATE, cela me donnera 00:00:00 heures pour tous mes enregistrements.


Le lien que j'ai donné comme deuxième solution consiste à utiliser la fonction «Date». Vous pouvez l'utiliser pour conserver le détail de l'heure.



0
votes

Je pense que vous devriez passer de java.util.Date à java.sql.Date à tous les endroits. Il existe des méthodes pour convertir entre les deux.

Bien que je préfère la logique à la recherche de findByDate. Entre la logique va être plus précise.

java.sql.Date JavaDoc,

Un wrapper fin autour d'une valeur milliseconde qui permet à JDBC d'identifier ceci en tant que valeur DATE SQL. Une valeur en millisecondes représente le nombre de millisecondes écoulées depuis le 1er janvier 1970 00: 00: 00.000 GMT.

Pour se conformer à la définition de SQL DATE, les valeurs en millisecondes encapsulé par une instance java.sql.Date doit être «normalisé» en définissant les heures, minutes, secondes et millisecondes à zéro dans le fuseau horaire particulier auquel l'instance est associée.

java.util.Date JavaDoc - ce JavaDoc est une section longue mais pertinente,

La classe Date représente un instant précis dans le temps, avec une milliseconde précision.


0 commentaires

1
votes

J'ai trouvé une solution de travail à mon problème, apparemment lors de l'utilisation du type de données TIMESTAMP, la méthode JPA-Data "findByDate ()" ne fonctionne pas immédiatement. En fait, j'avais besoin de trouver des enregistrements en comparant la partie date de l'horodatage uniquement, donc j'ai utilisé l'annotation de requête comme ceci:

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

c'est la fonction sql DATE () qui a aidé ici car elle ne prend que le une partie de la date de l'horodatage en compte lors de la comparaison avec la date que j'ai fournie pour la recherche. Avec cela, je pourrais rechercher des données comparant les dates tout en conservant le type d'horodatage (pour afficher les heures, les minutes, les secondes ..) Merci pour l'aide.


0 commentaires