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 :
"id_visitor" est l'IP de l'utilisateur et "id_article" l'id de l'article visité par l'internaute.
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;
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.
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.
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);
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);
Partager