Bonjour, j'aimerais de l'aide pour supprimer des dates en base de données. J'utilise java spring, dbeaver, mariadb et docker.
La situation :
J'ai une table "Article" qui contient un comptage de vues (vues des visiteurs).
Pour se faire, j'ai cette table :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
CREATE TABLE `visitor_info`
(
    `id_visitor`             varchar(255)  NOT NULL,
    `id_article`             bigint(20)  NOT NULL,
    `date_connection`        datetime(6) NOT NULL,
    PRIMARY KEY (`id_visitor`, `id_article`),
    KEY `FK_id_articleVisitor` (`id_article`),
    CONSTRAINT `FK_id_articleVisitor` FOREIGN KEY (`id_article`) REFERENCES `article` (`id`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4;
"id_visitor" est l'IP de l'utilisateur et "id_article" l'id de l'article visité par l'internaute.
J'ai codé quelque chose (un code exécuté tout les X temps) pour qu'un visiteur ne génère pas des vues sur un même article plus d'une fois par tranche de 24h.
Si la date stockée en bdd est inférieur à la date en paramètre (+24h de différence) elle doit être supprimée.

Dans le code ci dessous, ce n'est pas 24h mais 1mn. Et le code "deleteOldVisits()" s'exécute toutes les minutes. C'est pour faciliter le test.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Component
@EnableScheduling
public class ScheduledTasks {
    @Autowired
    private VisitorInfoDAO visitorInfoDAO;
 
    public ScheduledTasks() {
    }
 
    @Scheduled(cron = "0 * * * * ?")
    public void deleteOldVisits() {
        System.out.println("deleteOldVisits call");
        LocalDateTime cutoffDateTime = LocalDateTime.now().minusMinutes(1);
        this.visitorInfoDAO.deleteByDateConnectionBefore(cutoffDateTime);
    }
}
 
@Modifying
    @Query("DELETE FROM VisitorInfo v WHERE v.date_connection <= :cutoffDate")
    void deleteByDateConnectionBefore(@Param("cutoffDate") LocalDateTime cutoffDate);
Le problème c'est que cela ne marche pas. C'est étrange car à la base, date_connection est un "localdatetime.now()" donc cela signifie qu'il sait faire la conversion tout seul et que cela devrait fonctionner.
Il arrive a convertir "2023-03-11T11:43:00.011012" (localdatetime.now() dans java) en "2023-03-11 11:43:00" dans la base de données.

EDIT:
J'ai essayé aussi sans succès (j'ai renommé date_connection en date car l'automation ne marchait pas) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
        LocalDateTime cutoffDateTime = LocalDateTime.now().minusMinutes(1);
        DateTime cutoffDateTimeb = DateTime.now().minusMinutes(1);
 
        this.visitorInfoDAO.deleteByDateLessThan(cutoffDateTimeb);
        this.visitorInfoDAO.deleteByDateLessThan(cutoffDateTime);
 
    @Modifying
    void deleteByDateLessThan(LocalDateTime localDateTime);
    @Modifying
    void deleteByDateLessThan(DateTime localDateTime);