<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Sql on Java &amp; Moi</title><link>https://javaetmoi.com/tags/sql/</link><description>Recent content in Sql on Java &amp; Moi</description><generator>Hugo</generator><language>fr</language><lastBuildDate>Mon, 16 Jun 2025 06:57:01 +0000</lastBuildDate><atom:link href="https://javaetmoi.com/tags/sql/feed.xml" rel="self" type="application/rss+xml"/><item><title>De Spring Data JPA à jOOQ</title><link>https://javaetmoi.com/2025/06/de-spring-data-jpa-a-jooq/</link><pubDate>Mon, 16 Jun 2025 06:57:01 +0000</pubDate><guid isPermaLink="false">https://javaetmoi.com/?p=2580</guid><description>&lt;p&gt;Lors de la conférence Devoxx France 2025, j’ai participé à un hands-on lab de 2h intitulé &lt;a href="https://www.devoxx.fr/agenda-2025/talk/sortir-des-orms-avec-jooq/"&gt;Sortir des ORMs avec jOOQ&lt;/a&gt;. Acronyme de « &lt;strong&gt;Java Object Oriented Querying&lt;/strong&gt; », &lt;strong&gt;jOOQ&lt;/strong&gt; se présente comme une &lt;strong&gt;alternative à JPA&lt;/strong&gt; permettant d’ &lt;strong&gt;écrire des requêtes SQL&lt;/strong&gt; en Java via une &lt;strong&gt;fluent API&lt;/strong&gt;. Animé par Sylvain Decout et Samuel Lefebvre, cet atelier visait à migrer une application Spring Boot / JPA vers jOOQ à l’aide du &lt;strong&gt;starter Spring Boot&lt;/strong&gt; pour jOOQ. Pour les curieux, le repo de l’atelier est disponible sur Github : &lt;a href="https://github.com/sylvaindecout/jooq-handson"&gt;jooq-handson&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Fort de cette découverte, je me suis à mon tour prêté à l’exercice de migrer vers jOOQ la couche de persistance Spring Data JPA de l’application démo Spring Petclinic. Un nouveau fork est né : &lt;a href="https://github.com/spring-petclinic/spring-petclinic-jooq"&gt;&lt;strong&gt;spring-petclinic-jooq&lt;/strong&gt;&lt;/a&gt;. Bienvenue à ce dernier dans la communauté Spring Petclinic.&lt;/p&gt;
&lt;p&gt;L’usage de jOOQ se rapproche de l’utilisation de JdbcTemplate. Le développeur maitrise le nombre de requêtes envoyées à la base de données relationnelle. Ce qui les différencie, c’est la syntaxe : pas de SQL, mais une &lt;strong&gt;API Java fluide&lt;/strong&gt; et &lt;strong&gt;type-safe&lt;/strong&gt; spécifique à jOOQ qu’il va falloir appréhender. Rassurez-vous, cette API se rapproche du SQL : on y retrouve les mots clés &lt;strong&gt;select&lt;/strong&gt;, &lt;strong&gt;update&lt;/strong&gt;, &lt;strong&gt;insertInto&lt;/strong&gt;, &lt;strong&gt;where&lt;/strong&gt;, &lt;strong&gt;from&lt;/strong&gt;, &lt;strong&gt;join&lt;/strong&gt;, &lt;strong&gt;on&lt;/strong&gt;, &lt;strong&gt;as&lt;/strong&gt;… A ceux-ci, on ajoute des mots clés spécifiques à jOOQ : &lt;strong&gt;paginate&lt;/strong&gt;, &lt;strong&gt;fetch&lt;/strong&gt;, &lt;strong&gt;convertFrom&lt;/strong&gt; … La &lt;a href="https://www.jooq.org/learn/"&gt;&lt;strong&gt;documentation&lt;/strong&gt;&lt;/a&gt; de jOOQ est très &lt;strong&gt;complète&lt;/strong&gt;. On y apprend comment écrire des requêtes complexes à base de window function ou de Common Table Expressions (CTE) et comment utiliser des fonctionnalités avancées de SQL que peu de frameworks ORM supportent nativement : &lt;a href="https://www.jooq.org/doc/latest/manual/sql-building/column-expressions/json-functions/"&gt;JSON functions&lt;/a&gt;, &lt;a href="https://blog.jooq.org/how-to-use-sql-pivot-to-compare-two-tables-in-your-database/"&gt;PIVOT&lt;/a&gt;, &lt;a href="https://www.jooq.org/doc/latest/manual/sql-building/sql-statements/merge-statement/"&gt;MERGE&lt;/a&gt;, &lt;a href="https://www.jooq.org/doc/latest/manual/sql-building/sql-statements/select-statement/set-operations/set-operation-union/"&gt;UNION&lt;/a&gt; …&lt;/p&gt;
&lt;p&gt;Cet article a pour objectif d’expliquer les &lt;strong&gt;étapes&lt;/strong&gt; adoptées pour &lt;strong&gt;migrer l’implémentation Spring Data JPA des repository vers jOOQ&lt;/strong&gt;. Des exemples de code avant / après y sont proposés.&lt;/p&gt;</description></item><item><title>Spring Batch s'auto-nettoie</title><link>https://javaetmoi.com/2012/06/sprint-batch-sauto-nettoie/</link><pubDate>Tue, 26 Jun 2012 18:49:09 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=187</guid><description>&lt;p&gt;Lorsque vous mettez en œuvre &lt;strong&gt;&lt;a href="http://static.springsource.org/spring-batch/" title="Page d&amp;#39;accueil du projet Spring Batch"&gt;Spring Batch&lt;/a&gt;&lt;/strong&gt; pour réaliser des traitements par lots, vous avez le choix d’utiliser &lt;strong&gt;une implémentation de &lt;em&gt;JobRepository&lt;/em&gt;&lt;/strong&gt; soit &lt;strong&gt;en mémoire&lt;/strong&gt; soit &lt;strong&gt;persistante&lt;/strong&gt;. L’avantage de cette dernière est triple :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Conserver un &lt;strong&gt;historique des différentes exécutions&lt;/strong&gt; de vos instances de jobs.&lt;/li&gt;
&lt;li&gt;Pouvoir &lt;strong&gt;suivre en temps réel le déroulement de votre batch&lt;/strong&gt; via, par exemple, l’excellent &lt;a href="http://static.springsource.org/spring-batch-admin/" title="Page d&amp;#39;accueil du projet Spring Batch Admin"&gt;Spring Batch Admin&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Avoir la possibilité de &lt;strong&gt;reprendre un batch&lt;/strong&gt; là où il s’était arrêté en erreur.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;La contrepartie d’utiliser un JobRepository persistant est de devoir faire reposer le batch sur une &lt;strong&gt;base de données&lt;/strong&gt; relationnelles. Le schéma sur lequel s’appuie Spring Bath est composé de &lt;strong&gt;6 tables&lt;/strong&gt;. Leur MPD est disponible dans l’ &lt;a href="http://static.springsource.org/spring-batch/reference/html/metaDataSchema.html" title="Appendix B. Spring Batch Meta-Data Schema"&gt;annexe B. Meta-Data Schema&lt;/a&gt; du &lt;a href="http://static.springsource.org/spring-batch/reference/html/" title="Manuel de référence de Spring Batch au format HTML"&gt;manuel de référence de Spring Batch&lt;/a&gt;. SpringSource faisant bien les choses, les scripts DDL de différentes solutions du marché (ex : MySQL, Oracle, DB2, SQL Server, Postgres, H2 …) sont disponibles dans le package org.springframework.batch.core du JAR spring-batch-core-xxx.jar&lt;br&gt;Qui dit base de données, dit &lt;strong&gt;dimensionnement&lt;/strong&gt; de cette dernière. L’ &lt;strong&gt;espace disque requis&lt;/strong&gt; est alors &lt;strong&gt;fonction&lt;/strong&gt; du &lt;strong&gt;nombre d’exécutions&lt;/strong&gt; estimé, de la &lt;strong&gt;nature des informations contextuelles persistées&lt;/strong&gt; et de la &lt;strong&gt;durée de rétention&lt;/strong&gt; des données. Cette démarche prend tout son sens lorsqu’une instance de base de données est dédiée au schéma de Spring Batch. En faisant quelques hypothèses (ex : sur le taux d’échec) et en mesurant le volume occupé sur plusieurs exécutions des batchs, il est possible de prévoir assez finement l’espace occupé par les données.&lt;/p&gt;
&lt;p&gt;A moins de disposer de ressources infinies ou de n’avoir qu’un seul batch annuel, il est fréquent de fixer une durée de rétention de l’historique. Première option : demander à l’équipe d’exploitation de régulièrement lancer un script SQL de purge. Deuxième option : &lt;strong&gt;utiliser Spring Batch pour purger ses propres données&lt;/strong&gt; !!&lt;/p&gt;</description></item></channel></rss>