[JAVA] Premiers pas avec Doma - Introduction à l'API Criteria

introduction

Doma est un framework d'accès à la base de données qui s'exécute sur Java 8 et supérieur. Vous pouvez accéder aux bases de données pour lesquelles des pilotes JDBC sont fournis, telles que MySQL, PosgreSQL, Microsoft SQL Server et H2 Database.

Les versions récentes de Doma ont ajouté une nouvelle API pour la construction SQL de type sécurisé, l'API Criteira (https://doma.readthedocs.io/en/2.43.0/criteria-api/). Cet article présente l'API Criteria basée sur la dernière version 2.43.0 au moment de la rédaction.

Définition de la classe d'entité

Supposons que vous ayez un schéma de base de données qui ressemble à ceci:

create table employee (
    id integer not null primary key,
    name varchar(255) not null,
    age integer not null, 
    version integer not null);

La classe d'entité correspondant au tableau ci-dessus peut être définie comme suit:

@Entity(metamodel = @Metamodel)
public class Employee {
  @Id
  public Integer id;
  public String name;
  public Integer age;
  @Version public Integer version;
}

À première vue, c'est une définition de classe d'entité normale, mais notez que la déclaration @ Entity dit metamodel = @ Metamodel. Cette description est très importante, et en compilant avec les paramètres appropriés, une classe de métamodèle appelée `ʻEmployee_`` sera générée dans le même package que la classe Employee.

Mémo Contenu de la classe de modèle

Par souci de clarté, je vais l'omettre un peu, mais la classe de métamodèle ʻEmployee_` ressemble à ceci:

public final class Employee_ implements EntityMetamodel<Employee> {
  public final PropertyMetamodel<java.lang.Integer> id = ...;
  public final PropertyMetamodel<java.lang.String> name = ...;
  public final PropertyMetamodel<java.lang.Integer> age = ...;
  public final PropertyMetamodel<java.lang.Integer> version = ...;
}

L'intérêt de cette classe de métamodèle est qu'elle a des propriétés avec les mêmes noms que les propriétés de la classe d'entité, telles que ʻid, name, ʻage, version. Il contient également des informations sur le type de propriété dans la classe d'entité.

Voici un exemple de construction de SQL à l'aide de cette classe de métamodèle et de l'API Criteria.

Utilisation de l'API Criteria

L'API Criteria peut être utilisée n'importe où, mais elle sera plus facile à comprendre si vous créez une classe nommée xxxRepository et que vous l'utilisez dedans, par exemple.

public class EmployeeRepository {

  private final Entityql entityql;

  public EmployeeRepository(Config config) {
    this.entityql = new Entityql(config);
  }

  public Employee selectById(Integer id) {
    //Génération de métamodèles
    Employee_ e = new Employee_();
    //Assemblez SQL en utilisant un métamodèle et obtenez le résultat
    return entityql.from(e).where(c -> c.eq(e.id, id)).fetchOne();
  }
}

Le contenu de la méthode selectById de la classe ci-dessus est un exemple d'utilisation de l'API Criteria. Cette méthode utilise la classe métamodèle et la classe ʻEntityql`, qui est le point d'entrée de l'API Criteria, pour assembler SQL et obtenir le résultat de l'exécution en une seule entité.

Le SQL qui peut être assemblé ressemble à ceci:

select t0_.id, t0_.name, t0_.age, t0_.version from Employee t0_ where t0_.id = ?

Du point de vue de la sécurité des types, le point est la méthode ʻeqdans lewhere (c-> c.eq (e.id, id))` qui construit la clause WHERE. Cette méthode utilise des génériques pour déterminer le type du premier argument au type du deuxième argument au moment de la compilation.

En d'autres termes, dans cet exemple, le type du deuxième argument est déterminé comme étant le type ʻInteger en passant la propriété représentant le type ʻInteger de la classe de métamodèle au premier argument de la méthode ʻeq. Par conséquent, cela empêche de passer un type incorrect au deuxième argument (ce qui entraîne une erreur à l'exécution), par exemple c.eq (e.id," String value ")`. ..

en conclusion

En utilisant l'exemple de récupération d'une entité, nous avons montré que l'API Criteri de Doma permet la construction de type sécurisé de SQL.

L'équivalent du code présenté ici est disponible dans le projet ci-dessous.

Recommended Posts

Premiers pas avec Doma - Introduction à l'API Criteria
Premiers pas avec les sous-requêtes utilisant Doma avec l'API Criteria
Premiers pas avec Doma-Dynamic Construction de clauses WHERE avec l'API Criteria
Premiers pas avec Doma-Using Projection avec l'API Criteira
Premiers pas avec Doma-Using Joins avec l'API Criteira
Premiers pas avec Reactive Streams et l'API JDK 9 Flow
Il est maintenant temps de commencer avec l'API Stream
Premiers pas avec Doma-Criteria API Cheet Sheet
Démarrez avec le fonctionnement de JVM GC
Revenir au début, démarrer avec Java ② Instructions de contrôle, instructions de boucle
Premiers pas avec DBUnit
Premiers pas avec Ruby
Premiers pas avec Kotlin à envoyer aux développeurs Java
Premiers pas avec Swift
Premiers pas avec Doma-Transactions
Prise en main des opérateurs logiques utilisant Doma tels que AND et OR dans la clause WHERE de l'API Criteria
Premiers pas avec le traitement Doma-Annotation
Premiers pas avec Java Collection
Premiers pas avec JSP et servlet
Premiers pas avec les bases de Java
Premiers pas avec Spring Boot
Premiers pas avec les modules Ruby
Revenir au début et démarrer avec Java ① Types de données et modificateurs d'accès
Ce à quoi j'étais accro avec l'API REST Redmine
Comment démarrer avec Slim
[java8] Pour comprendre l'API Stream
Premiers pas avec Java_Chapitre 5_Exercices pratiques 5_4
[Google Cloud] Premiers pas avec Docker
Premiers pas avec Docker avec VS Code
CompletableFuture Getting Started 2 (Essayez de faire CompletableFuture)
Premiers pas avec Ruby pour les ingénieurs Java
J'ai essayé de démarrer avec Web Assembly
[Note] Comment démarrer avec Rspec
Introduction à Java à partir de 0 Partie 1
Comment convertir un tableau de chaînes en un tableau d'objets avec l'API Stream
Premiers pas avec Ratpack (4) - Routage et contenu statique
J'ai essayé de résumer l'API Stream
Premiers pas avec Micronaut 2.x ~ Construction native et déploiement sur AWS Lambda ~
Premiers pas avec Language Server Protocol avec LSP4J
Je veux introduire un comité avec des rails sans devenir trop sale
Premiers pas avec la création d'ensembles de ressources avec ListResoueceBundle
Partie 2 Partie II. Comment procéder avec la mise en route Guide de référence de Spring Boot Remarque ①
Imprimez des formulaires directement sur l'imprimante avec Jasper Reports
Liens et mémos pour démarrer avec Java (pour moi-même)
Affectation à plusieurs variables avec l'opérateur ternaire
Premiers pas avec Java 1 Assembler des éléments similaires
Comment utiliser l'API Java avec des expressions lambda
passer deux arguments à l'URI avec link_to
Comment créer une API avec GraphQL et Rails
Les débutants de Rails ont essayé de se lancer avec RSpec
Essayez de résumer la disposition commune avec des rails
J'ai essayé de démarrer avec Gradle sur Heroku
J'ai essayé de vérifier le fonctionnement de la requête http (Put) avec Talented API Tester
Implémentons une fonction pour limiter le nombre d'accès à l'API avec SpringBoot + Redis
Je veux accéder à l'API avec Rails sur plusieurs docker-composes configurés localement
[DDD] Quelle est l'architecture la plus accessible pour démarrer avec la conception pilotée par domaine?
Comment changer l'action avec plusieurs boutons d'envoi
Prise en main des programmes Java à l'aide de Visual Studio Code
Mappez automatiquement DTO aux entités avec l'API Spring Boot