[JAVA] Comment joindre une table sans utiliser DBFlute et SQL

introduction

Ravi de vous rencontrer, tout le monde. Je m'appelle Wu et je suis en charge de cette série.

Il existe trois outils de cartographie O / R typiques (iBATIS, Torque, Hibernate), Cette fois, je voudrais présenter DBFlute comme un mappage O / R.

Pourquoi voulez-vous éviter autant que possible d'utiliser DBFlute hors de SQL? Les deux raisons suivantes: (1) Si des instructions SQL sont écrites à différents endroits du code source, vous devez toujours être conscient des problèmes tels que les omissions et les erreurs de développement. (2) Le mappage O / R réduit le travail compliqué lié aux opérations de la base de données au moment de la mise en œuvre et résout le «décalage».

Contexte du défi

Il y avait une page d'accueil DBFlute, mais les connaissances sont dispersées et afin d'utiliser le travail sur le terrain, il est nécessaire d'organiser le fichier de configuration (additionalforeignkey.dfprop) et comment écrire la source Java.

Explication de la méthode de jointure de table

Cet article utilise DBFlute-1.0.5N et JAVA7.

Mécanisme de base de DBFlute

Mécanisme approximatif du mappage O / R de DBFlute (1) Génération automatique dans DBFlute DBFlute est un mappage O / R qui ne fonctionne qu'avec des classes générées automatiquement. (2) Implémentation JAVA Behavior Contrôle le traitement de tous les accès DB Conditions de recherche ConditionBean Build Pour plus de détails, reportez-vous au Manuel de mise en œuvre.

S'il n'y a pas de clé externe liée entre deux ou plusieurs tables et que vous souhaitez les joindre en entreprise, utilisez la méthode suivante.

Exemple:

Tableau d'utilisation

TableA TableB TableC
A_column_1 B_column_1 C_column_1
A_column_2 B_column_1 C_column_1

1, résultat d'exécution attendu SQL (jointure TableA et TableB): SELECT * FROM TableA A LEFT JOIN TableB B ON A.A_column_1 = B.B_column_1

fichier de configuration: ; FK_TableA_TO_TableB_BY_ID = map:{ ; localTableName = TableA ; foreignTableName = TableB ; localColumnName = A_column_1 ; foreignColumnName = B_column_1 ; fixedSuffix = ByID }

JAVA: //TableA情報の取得

TableACB cb = tableABhv.newMyConditionBean();


cb.setupSelect_TableBById();```  

---------------------------------------

 2. Résultat d'exécution attendu SQL (Join TableA / TableB et TableB / TableC):
SELECT * 
FROM TableA A
INNER JOIN TableB B
ON A.A_column_1 = B.B_column_1
INNER JOIN TableC C
ON B.B_column_1 = C.C_column_1

 fichier de configuration:
 ; FK_TableB_TO_TableC_BY_ID = map:{
   ; localTableName  = TableB  ; foreignTableName  = TableC
   ; localColumnName = B_column_1 ; foreignColumnName = C_column_1
   ; fixedSuffix = ById
 }

 ; FK_TableA_TO_TableB_BY_ID = map:{
   ; localTableName  = TableA  ; foreignTableName  = TableB
   ; localColumnName = A_column_1 ; foreignColumnName = B_column_1
   ; fixedSuffix = ById
 }

JAVA:
 //TableA情報の取得

#### **`TableACB cb = tableABhv.newMyConditionBean();`**
```newMyConditionBean();

cb.setupSelect_TableBById();
cb.setupSelect_TableBById().join();
cb.setupSelect_TableBById().withTableCBId();
cb.setupSelect_TableBById().withTableCBId().join();```

---------------------------------------
 3, résultat d'exécution attendu SQL (jointure TableA / TableB et TableB / TableC et TableA / TableC):

SELECT * 
FROM TableA A
LEFT JOIN TableB B
ON A.A_column_1 = B.B_column_1
LEFT JOIN TableC C
ON B.B_column_1 = C.C_column_1
AND A.A_column_2 = C.C_column_2

 fichier de configuration:
 ; FK_TableA_TO_TableB_BY_ID = map:{
   ; localTableName  = TableA  ; foreignTableName  = TableB
   ; localColumnName = A_column_1 ; foreignColumnName = B_column_1
   ; fixedSuffix = ById
 }

 ; FK_TableA_TO_TableC_BY_ID = map:{
   ; localTableName  = TableA  ; foreignTableName  = TableC
   ; localColumnName = A_column_2 ; foreignColumnName = C_column_2
   ; fixedCondition = `$$foreignAlias$$.C_column_1 = $$over($localTable.tableBById)$$.B_column_1`
   ; fixedSuffix = ById
 }

JAVA:
 //TableA情報の取得

#### **`TableACB cb = tableABhv.newMyConditionBean();`**
```newMyConditionBean();

cb.setupSelect_TableBById();
cb.setupSelect_TableCById();```

---------------------------------------
 4, résultat d'exécution SQL (sous-requête corrélée dans fixedCondition):

SELECT * 
FROM TableA A
INNER JOIN TableB B
ON A.A_column_1 = B.B_column_1
INNER JOIN TableC C
ON B.B_column_1 = C.C_column_1
AND A.A_column_2 = C.C_column_2
INNER JOIN 
	(SELECT TC.C_column_1 
	  		,MAX(CAST(TC.C_column_2 AS INT)) AS VER 
 			FROM TableC TC
			GROUP BY
			TC.C_column_1
			TC.C_column_2
		) C_0 
ON C_0.C_column_1 = C.C_column_1


 fichier de configuration:

 ; FK_TableA_TO_TableB_BY_ID = map:{
   ; localTableName  = TableA  ; foreignTableName  = TableB
   ; localColumnName = A_column_1 ; foreignColumnName = B_column_1
   ; fixedSuffix = ById
 }

 ; FK_TableA_TO_TableC_BY_ID = map:{
   ; localTableName  = TableA  ; foreignTableName  = TableC
   ; localColumnName = A_column_2 ; foreignColumnName = C_column_2
   ; fixedCondition = `$$foreignAlias$$.C_column_1 = $$over($localTable.tableBById)$$.B_column_1`
	INNER JOIN 
		(SELECT TC.C_column_1 
	  		,MAX(CAST(TC.C_column_2 AS INT)) AS VER 
 			FROM TableC TC
			GROUP BY
			TC.C_column_1
			TC.C_column_2
		) C_0 
	ON C_0.C_column_1 = `$$foreignAlias$$.C_column_1`
   ; fixedSuffix = ById
 }


JAVA:

 //TableA情報の取得

#### **`TableACB cb = tableABhv.newMyConditionBean();`**
```newMyConditionBean();

cb.setupSelect_TableBById();
cb.setupSelect_TableBById().join();
cb.setupSelect_TableCById();
cb.setupSelect_TableCById().join();```

---------------------------------------
#### Glossaire du fichier de paramètres

 Je pense que les Mac montrés ci-dessus ont les significations suivantes et seront utilisés après les avoir compris.

 `$$ ForeignAlias $$`: Elias de la table référencée
 `$$ localAlias $$`: Elias de la table référente
 `$$ over ([nom de la table]. [Nom de la relation]) $$`: Elias de la table d'une autre relation
 `$$ over ($ localTable. [Nom de la relation]) $$`: Table étrangère de la table locale
 `$$ over ($ ForeignTable. [Relation name]) $$`: Table étrangère de la table étrangère

---------------------------------------
# Résumé
 En combinant le fichier de configuration BDflute et la source JAVA par paires, toutes les tables peuvent être jointes sans utiliser SQL externe.
 Cette explication est une méthode pour faire face au cas de la jonction de plusieurs tables souvent utilisées sur le terrain, mais en réalité je pense que c'est beaucoup de savoir-faire détaillé, mais la prochaine fois j'expliquerai le savoir-faire à mettre en œuvre côté JAVA.

---------------------------------------
# Matériel de référence
 ~ Mappeur O / R orienté site ~
http://dbflute.seasar.org/

 Qu'est-ce que additionalForeignKeyMap?
http://dbflute.seasar.org/ja/manual/reference/dfprop/additionalforeignkey/










Recommended Posts

Comment joindre une table sans utiliser DBFlute et SQL
Comment convertir A en A et A en A en utilisant le produit logique et la somme en Java
Comment exécuter un contrat avec web3j
Comment trier une liste à l'aide du comparateur
[Rails] Comment créer une table, ajouter une colonne et changer le type de colonne
Comment sortir Excel et PDF avec Excella
Réaliser une table de décision sans utiliser le branchement conditionnel
Comment exécuter une méthode et simuler avec JUnit
[Rails] Comment créer un graphique à l'aide de lazy_high_charts
Comment supprimer un contrôleur, etc. à l'aide d'une commande
Comment jouer de la voix ou de la musique en utilisant javascript
[Ethereum] Comment exécuter un contrat en utilisant web3j-Part 2-
Comment générer une clé primaire à l'aide de @GeneratedValue
Lors de l'exécution d'une jointure externe complète sans utiliser de jointure externe complète
Comment effacer toutes les données d'une table particulière
Comment mettre à jour les informations utilisateur sans mot de passe
Comment supprimer des éléments d'adaptateur personnalisés à l'aide d'un modèle personnalisé
Comment démarrer le serveur local de Tomcat sans utiliser eclipse
Comment utiliser Play Framework sans utiliser l'activateur de sécurité
Comment faire un cache sans trop réfléchir
[Docker] Comment mettre à jour à l'aide d'un conteneur dans Heroku et comment gérer l'erreur de migration
Comment implémenter une image de profil circulaire avec CarrierWave et R Magick in Rails
Comment tester avec des images lors de l'utilisation d'ActiveStorage et de Faker
Comment laisser un commentaire
Comment développer dans des fichiers Xib sans utiliser Storyboard
Comment utiliser la jonction de rails
Comment définir et décrire des variables d'environnement à l'aide de Rails zsh
Comment installer JDK 8 sur Windows sans utiliser le programme d'installation
Comment développer et enregistrer une application Sota en Java
Comment installer les pilotes PHP 7.4 et SQL Server dans CentOS 7.7
Comment insérer une vidéo
Comment créer une méthode
Comment créer et lancer un Dockerfile pour Payara Micro
Comment s'inscrire en tant que client dans Square à l'aide de Tomcat
Comment autoriser à l'aide de graphql-ruby
Comment contrôler les transactions dans Spring Boot sans utiliser @Transactional
Comment obtenir le dernier ID de diffusion en direct pour une chaîne sans utiliser l'API de données YouTube
Comment créer un fichier jar et un fichier war à l'aide de la commande jar
Comment créer un hinadan pour un projet Spring Boot à l'aide de SPRING INITIALIZR
[Rails 6] Comment créer un écran de saisie de formulaire dynamique à l'aide de cocoon
Comment POST JSON dans la méthode Java en utilisant OkHttp3 et la méthode en utilisant HttpUrlConnection-
Comment charger un fichier de téléchargement Spring et afficher son contenu
Comment lire un fichier et le traiter comme une entrée standard
[Rails] Comment télécharger des images sur AWS S3 à l'aide de Carrierwave et de fog-aws
[Rails] Comment télécharger des images sur AWS S3 à l'aide de refile et refile-s3
[Swift5] Comment communiquer de ViewController à Model et transmettre une valeur
Comment construire un peu délicat avec la génération de requêtes SQL dynamiques
Comment faire un diamant révolutionnaire en utilisant Java pour déclaration wwww
Comment utiliser StringBurrer et Arrays.toString.
Comment utiliser EventBus3 et ThreadMode
Comment créer un conteneur Java
[Java] Comment utiliser la méthode de jointure
Comment créer un pilote JDBC
Comment appeler des classes et des méthodes