Configuration des balises - AWS Chiffrement des bases SDK

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Configuration des balises

Notre bibliothèque de chiffrement côté client a été renommée SDK de chiffrement de AWS base de données. Ce guide du développeur fournit toujours des informations sur le client de chiffrement DynamoDB.

Il existe deux types de balises compatibles avec le chiffrement consultable. Les balises standard effectuent des recherches d'égalité. Ils constituent le moyen le plus simple d'implémenter le chiffrement consultable dans votre base de données. Les balises composées combinent des chaînes de texte en clair littérales et des balises standard pour effectuer des requêtes plus complexes.

Les balises sont conçues pour être implémentées dans de nouvelles bases de données non peuplées. Toute balise configurée dans une base de données existante ne mappera que les nouveaux enregistrements écrits dans la base de données. Les balises sont calculées à partir de la valeur en texte brut d'un champ. Une fois le champ crypté, il n'est plus possible pour la balise de mapper les données existantes. Une fois que vous avez écrit de nouveaux enregistrements avec une balise, vous ne pouvez pas mettre à jour la configuration de la balise. Vous pouvez toutefois ajouter de nouvelles balises pour les nouveaux champs que vous ajoutez à votre enregistrement.

Après avoir déterminé vos modèles d'accès, la configuration des balises doit être la deuxième étape de l'implémentation de votre base de données. Ensuite, après avoir configuré toutes vos balises, vous devez créer un jeu de clés AWS KMS hiérarchique, définir la version de la balise, configurer un index secondaire pour chaque balise, définir vos actions cryptographiques et configurer votre base de données et le client du SDK AWS Database Encryption. Pour plus d'informations, consultez la section Utilisation de balises.

Pour faciliter la définition de la version des balises, nous vous recommandons de créer des listes pour les balises standard et composées. Ajoutez chaque balise que vous créez à la liste de balises standard ou composée correspondante au fur et à mesure de sa configuration.

Configuration des balises standard

Les balises standard constituent le moyen le plus simple d'implémenter un chiffrement consultable dans votre base de données. Ils ne peuvent effectuer des recherches d'égalité que pour un seul champ crypté ou virtuel.

Exemple de syntaxe de configuration

Java
List<StandardBeacon> standardBeaconList = new ArrayList<>(); StandardBeacon exampleStandardBeacon = StandardBeacon.builder() .name("beaconName") .length(beaconLengthInBits) .build(); standardBeaconList.add(exampleStandardBeacon);
C# / .NET
var standardBeaconList = new List<StandardBeacon>(); StandardBeacon exampleStandardBeacon = new StandardBeacon { Name = "beaconName", Length = 10 }; standardBeaconList.Add(exampleStandardBeacon);

Pour configurer une balise standard, fournissez les valeurs suivantes.

Nom de la balise

Le nom que vous utilisez lorsque vous interrogez un champ chiffré.

Le nom d'une balise peut être le même que celui d'un champ crypté ou d'un champ virtuel, mais il ne peut pas être le même que celui d'un champ non chiffré. Nous vous recommandons vivement d'utiliser le nom du champ crypté ou du champ virtuel à partir duquel votre balise standard est construite dans la mesure du possible. Deux balises différentes ne peuvent pas porter le même nom de balise. Pour obtenir de l'aide pour déterminer le meilleur nom de balise pour votre implémentation, consultez Choisir un nom de balise.

Longueur de la balise

Nombre de bits de la valeur de hachage de la balise conservés après la troncature.

La longueur de la balise détermine le nombre moyen de faux positifs produits par une balise donnée. Pour plus d'informations et pour vous aider à déterminer la longueur de balise appropriée pour votre implémentation, consultez la section Détermination de la longueur de balise.

Source de balise (facultatif)

Champ à partir duquel une balise standard est construite.

La source de la balise doit être un nom de champ ou un index faisant référence à la valeur d'un champ imbriqué. Lorsque le nom de votre balise est identique à celui de la source de la balise, vous pouvez omettre la source de la balise dans votre configuration et le SDK de chiffrement de AWS base de données utilisera automatiquement le nom de la balise comme source de balise.

Création d'un champ virtuel

Pour créer un champ virtuel, vous devez fournir un nom pour le champ virtuel et une liste des champs sources. L'ordre dans lequel vous ajoutez les champs source à la liste des pièces virtuelles détermine l'ordre dans lequel ils sont concaténés pour créer le champ virtuel. L'exemple suivant concatène deux champs source dans leur intégralité pour créer un champ virtuel.

Note

Nous vous recommandons de vérifier que vos champs virtuels produisent le résultat attendu avant de remplir votre base de données. Pour plus d'informations, consultez Tester les sorties des balises.

Java

Voir l'exemple de code complet : VirtualBeaconSearchableEncryptionExample.java

List<VirtualPart> virtualPartList = new ArrayList<>(); virtualPartList.add(sourceField1); virtualPartList.add(sourceField2); VirtualField virtualFieldName = VirtualField.builder() .name("virtualFieldName") .parts(virtualPartList) .build(); List<VirtualField> virtualFieldList = new ArrayList<>(); virtualFieldList.add(virtualFieldName);
C# / .NET

Voir l'exemple de code complet : VirtualBeaconSearchableEncryptionExample.cs

var virtualPartList = new List<VirtualPart> { sourceField1, sourceField2 }; var virtualFieldName = new VirtualField { Name = "virtualFieldName", Parts = virtualPartList }; var virtualFieldList = new List<VirtualField> { virtualFieldName };

Pour créer un champ virtuel avec un segment spécifique d'un champ source, vous devez définir cette transformation avant d'ajouter le champ source à votre liste de pièces virtuelles.

Considérations relatives à la sécurité des champs virtuels

Les balises ne modifient pas l'état chiffré du champ. Cependant, lorsque vous utilisez des balises, il existe un compromis inhérent entre l'efficacité de vos requêtes et la quantité d'informations révélées sur la distribution de vos données. La façon dont vous configurez votre balise détermine le niveau de sécurité préservé par cette balise.

Évitez de créer un champ virtuel dont les champs source se chevauchent avec les balises standard existantes. La création de champs virtuels incluant un champ source qui a déjà été utilisé pour créer une balise standard peut réduire le niveau de sécurité des deux balises. L'ampleur de la réduction de la sécurité dépend du niveau d'entropie ajouté par les champs source supplémentaires. Le niveau d'entropie est déterminé par la distribution de valeurs uniques dans le champ source supplémentaire et par le nombre de bits que le champ source supplémentaire contribue à la taille globale du champ virtuel.

Vous pouvez utiliser la population et la longueur des balises pour déterminer si les champs source d'un champ virtuel préservent la sécurité de votre ensemble de données. La population est le nombre attendu de valeurs uniques dans un champ. Votre population n'a pas besoin d'être précise. Pour obtenir de l'aide pour estimer la population d'un champ, voir Estimer la population.

Examinez l'exemple suivant lorsque vous examinez la sécurité de vos champs virtuels.

  • Beacon1 est construit à partir de. FieldA FieldAa une population supérieure à 2 (longueur de Beacon1).

  • Beacon2 est construit à partir deVirtualField, qui est construit à partir deFieldA, FieldBFieldC, et. FieldD Ensemble, FieldBFieldC, et FieldD ont une population supérieure à 2 N

Beacon2 préserve la sécurité de Beacon1 et de Beacon2 si les affirmations suivantes sont vraies :

N ≥ (Beacon1 length)/2

and

N ≥ (Beacon2 length)/2

Définition des styles de balises

Les balises standard peuvent être utilisées pour effectuer des recherches d'égalité pour un champ crypté ou virtuel. Ils peuvent également être utilisés pour créer des balises composées afin d'effectuer des opérations de base de données plus complexes. Pour vous aider à organiser et à gérer les balises standard, le SDK AWS de chiffrement de base de données fournit les styles de balises facultatifs suivants qui définissent l'utilisation prévue d'une balise standard.

Note

Pour définir les styles de balises, vous devez utiliser la version 3.2 ou ultérieure du SDK AWS Database Encryption. Déployez la nouvelle version sur tous les lecteurs avant d'ajouter des styles de balises à vos configurations de balises.

PartOnly

Une balise standard définie comme ne PartOnly peut être utilisée que pour définir une partie cryptée d'une balise composée. Vous ne pouvez pas interroger directement une balise PartOnly standard.

Java
List<StandardBeacon> standardBeaconList = new ArrayList<>(); StandardBeacon exampleStandardBeacon = StandardBeacon.builder() .name("beaconName") .length(beaconLengthInBits) .style( BeaconStyle.builder() .partOnly(PartOnly.builder().build()) .build() ) .build(); standardBeaconList.add(exampleStandardBeacon);
C#//.NET
new StandardBeacon { Name = "beaconName", Length = beaconLengthInBits, Style = new BeaconStyle { PartOnly = new PartOnly() } }
Shared

Par défaut, chaque balise standard génère une clé HMAC unique pour le calcul de la balise. Par conséquent, vous ne pouvez pas effectuer de recherche d'égalité sur les champs chiffrés à partir de deux balises standard distinctes. Une balise standard définie comme Shared utilise la clé HMAC d'une autre balise standard pour ses calculs.

Par exemple, si vous devez comparer des beacon1 champs à des beacon2 champs, beacon2 définissez-les comme une Shared balise qui utilise la clé HMAC de beacon1 pour ses calculs.

Note

Tenez compte de vos besoins en matière de sécurité et de performances avant de configurer des Shared balises. Sharedles balises peuvent augmenter la quantité d'informations statistiques pouvant être identifiées sur la distribution de votre ensemble de données. Par exemple, ils peuvent révéler quels champs partagés contiennent la même valeur en texte brut.

Java
List<StandardBeacon> standardBeaconList = new ArrayList<>(); StandardBeacon exampleStandardBeacon = StandardBeacon.builder() .name("beacon2") .length(beaconLengthInBits) .style( BeaconStyle.builder() .shared(Shared.builder().other("beacon1").build()) .build() ) .build(); standardBeaconList.add(exampleStandardBeacon);
C#//.NET
new StandardBeacon { Name = "beacon2", Length = beaconLengthInBits, Style = new BeaconStyle { Shared = new Shared { Other = "beacon1" } } }
AsSet

Par défaut, si la valeur d'un champ est un ensemble, le SDK AWS de chiffrement de base de données calcule une balise standard unique pour l'ensemble. Par conséquent, vous ne pouvez pas exécuter la requête CONTAINS(a, :value) où se a trouve un champ crypté. Une balise standard définie comme AsSet calcule des valeurs de balise standard individuelles pour chaque élément individuel de l'ensemble et stocke la valeur de balise dans l'élément sous forme d'ensemble. Cela permet au SDK AWS de chiffrement de base de données d'exécuter la requêteCONTAINS(a, :value).

Pour définir une balise AsSet standard, les éléments de l'ensemble doivent appartenir à la même population afin qu'ils puissent tous utiliser la même longueur de balise. L'ensemble de balises peut comporter moins d'éléments que le jeu de texte en clair en cas de collisions lors du calcul des valeurs des balises.

Note

Tenez compte de vos besoins en matière de sécurité et de performances avant de configurer des AsSet balises. AsSetles balises peuvent augmenter la quantité d'informations statistiques pouvant être identifiées sur la distribution de votre ensemble de données. Par exemple, ils peuvent révéler la taille de l'ensemble de texte en clair.

Java
List<StandardBeacon> standardBeaconList = new ArrayList<>(); StandardBeacon exampleStandardBeacon = StandardBeacon.builder() .name("beaconName") .length(beaconLengthInBits) .style( BeaconStyle.builder() .asSet(AsSet.builder().build()) .build() ) .build(); standardBeaconList.add(exampleStandardBeacon);
C#//.NET
new StandardBeacon { Name = "beaconName", Length = beaconLengthInBits, Style = new BeaconStyle { AsSet = new AsSet() } }
SharedSet

Une balise standard définie comme SharedSet combine les AsSet fonctions Shared et afin que vous puissiez effectuer des recherches d'égalité sur les valeurs cryptées d'un ensemble et d'un champ. Cela permet au SDK AWS de chiffrement de base de données d'exécuter la requête CONTAINS(a, b) lorsqu'il a s'agit d'un ensemble chiffré et b d'un champ chiffré.

Note

Tenez compte de vos besoins en matière de sécurité et de performances avant de configurer des Shared balises. SharedSetles balises peuvent augmenter la quantité d'informations statistiques pouvant être identifiées sur la distribution de votre ensemble de données. Par exemple, ils peuvent révéler la taille de l'ensemble de texte en clair ou les champs partagés contenant la même valeur en texte brut.

Java
List<StandardBeacon> standardBeaconList = new ArrayList<>(); StandardBeacon exampleStandardBeacon = StandardBeacon.builder() .name("beacon2") .length(beaconLengthInBits) .style( BeaconStyle.builder() .sharedSet(SharedSet.builder().other("beacon1").build()) .build() ) .build(); standardBeaconList.add(exampleStandardBeacon);
C#//.NET
new StandardBeacon { Name = "beacon2", Length = beaconLengthInBits, Style = new BeaconStyle { SharedSet = new SharedSet { Other = "beacon1" } } }

Configuration de balises composées

Les balises composées combinent des chaînes de texte brut littérales et des balises standard pour effectuer des opérations de base de données complexes, telles que l'interrogation de deux types d'enregistrement différents à partir d'un seul index ou l'interrogation d'une combinaison de champs à l'aide d'une clé de tri. Les balises composées peuvent être construites à partir de ENCRYPT_AND_SIGNSIGN_ONLY, et de SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT champs. Vous devez créer une balise standard pour chaque champ chiffré inclus dans la balise composée.

Note

Nous vous recommandons de vérifier que vos balises composées produisent le résultat attendu avant de remplir votre base de données. Pour plus d'informations, consultez Tester les sorties des balises.

Exemple de syntaxe de configuration

Java

Configuration de balise composée

L'exemple suivant définit des listes de pièces chiffrées et signées localement dans la configuration des balises composées.

List<CompoundBeacon> compoundBeaconList = new ArrayList<>(); CompoundBeacon exampleCompoundBeacon = CompoundBeacon.builder() .name("compoundBeaconName") .split(".") .encrypted(encryptedPartList) .signed(signedPartList) .constructors(constructorList) .build(); compoundBeaconList.add(exampleCompoundBeacon);

Définition de la version de la balise

L'exemple suivant définit les listes de pièces chiffrées et signées de manière globale dans la version balise. Pour plus d'informations sur la définition de la version des balises, consultez la section Utilisation des balises.

List<BeaconVersion> beaconVersions = new ArrayList<>(); beaconVersions.add( BeaconVersion.builder() .standardBeacons(standardBeaconList) .compoundBeacons(compoundBeaconList) .encryptedParts(encryptedPartList) .signedParts(signedPartList) .version(1) // MUST be 1 .keyStore(keyStore) .keySource(BeaconKeySource.builder() .single(SingleKeyStore.builder() .keyId(branchKeyId) .cacheTTL(6000) .build()) .build()) .build() );
C# / .NET

Voir l'exemple de code complet : BeaconConfig.cs

Configuration de balise composée

L'exemple suivant définit des listes de pièces chiffrées et signées localement dans la configuration des balises composées.

var compoundBeaconList = new List<CompoundBeacon>(); var exampleCompoundBeacon = new CompoundBeacon { Name = "compoundBeaconName", Split = ".", Encrypted = encryptedPartList, Signed = signedPartList, Constructors = constructorList }; compoundBeaconList.Add(exampleCompoundBeacon);

Définition de la version de la balise

L'exemple suivant définit les listes de pièces chiffrées et signées de manière globale dans la version balise. Pour plus d'informations sur la définition de la version des balises, consultez la section Utilisation des balises.

var beaconVersions = new List<BeaconVersion> { new BeaconVersion { StandardBeacons = standardBeaconList, CompoundBeacons = compoundBeaconList, EncryptedParts = encryptedPartsList, SignedParts = signedPartsList, Version = 1, // MUST be 1 KeyStore = keyStore, KeySource = new BeaconKeySource { Single = new SingleKeyStore { KeyId = branchKeyId, CacheTTL = 6000 } } } };

Vous pouvez définir vos parties chiffrées et vos parties signées dans des listes définies localement ou globalement. Nous vous recommandons de définir vos parties cryptées et signées dans une liste globale dans la version balise dans la mesure du possible. En définissant les parties chiffrées et signées de manière globale, vous pouvez définir chaque partie une seule fois, puis les réutiliser dans plusieurs configurations de balises composées. Si vous n'avez l'intention d'utiliser une pièce chiffrée ou signée qu'une seule fois, vous pouvez la définir dans une liste locale dans la configuration des balises composées. Vous pouvez référencer des pièces locales et globales dans votre liste de constructeurs.

Si vous définissez vos listes de pièces chiffrées et signées de manière globale, vous devez fournir une liste de composants du constructeur identifiant toutes les manières possibles dont la balise composée peut assembler les champs dans votre configuration de balise composée.

Note

Pour définir des listes de pièces chiffrées et signées de manière globale, vous devez utiliser la version 3.2 ou ultérieure du SDK AWS Database Encryption. Déployez la nouvelle version sur tous les lecteurs avant de définir de nouvelles pièces de manière globale.

Vous ne pouvez pas mettre à jour les configurations de balises existantes pour définir des listes de pièces chiffrées et signées dans le monde entier.

Pour configurer une balise composée, fournissez les valeurs suivantes.

Nom de la balise

Le nom que vous utilisez lorsque vous interrogez un champ chiffré.

Le nom d'une balise peut être le même que celui d'un champ crypté ou d'un champ virtuel, mais il ne peut pas être le même que celui d'un champ non chiffré. Deux balises ne peuvent pas porter le même nom de balise. Pour obtenir de l'aide pour déterminer le meilleur nom de balise pour votre implémentation, consultez Choisir un nom de balise.

Personnage divisé

Le caractère utilisé pour séparer les parties qui composent votre balise composée.

Le caractère divisé ne peut apparaître dans les valeurs en texte brut d'aucun des champs à partir desquels la balise composée est construite.

Liste de pièces cryptée

Identifie les ENCRYPT_AND_SIGN champs inclus dans la balise composée.

Chaque partie doit inclure un nom et un préfixe. Le nom de pièce doit être le nom de la balise standard construite à partir du champ crypté. Le préfixe peut être n'importe quelle chaîne, mais il doit être unique. Une pièce chiffrée ne peut pas avoir le même préfixe qu'une pièce signée. Nous recommandons d'utiliser une valeur courte qui distingue la pièce des autres parties desservies par la balise composée.

Nous vous recommandons de définir vos parties cryptées de manière globale dans la mesure du possible. Vous pouvez envisager de définir une partie chiffrée localement si vous avez l'intention de ne l'utiliser que dans une seule balise composée. Une partie cryptée définie localement ne peut pas avoir le même préfixe ou le même nom qu'une partie cryptée définie globalement.

Java
List<EncryptedPart> encryptedPartList = new ArrayList<>); EncryptedPart encryptedPartExample = EncryptedPart.builder() .name("standardBeaconName") .prefix("E-") .build(); encryptedPartList.add(encryptedPartExample);
C# / .NET
var encryptedPartList = new List<EncryptedPart>(); var encryptedPartExample = new EncryptedPart { Name = "compoundBeaconName", Prefix = "E-" }; encryptedPartList.Add(encryptedPartExample);
Liste de pièces signée

Identifie les champs signés inclus dans la balise composée.

Note

Les pièces signées sont facultatives. Vous pouvez configurer une balise composée qui ne fait référence à aucune pièce signée.

Chaque partie doit inclure un nom, une source et un préfixe. La source est le SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT champ SIGN_ONLY ou que l'article identifie. La source doit être un nom de champ ou un index faisant référence à la valeur d'un champ imbriqué. Si le nom de votre pièce identifie la source, vous pouvez omettre la source et le SDK AWS de chiffrement de base de données utilisera automatiquement le nom comme source. Nous recommandons de spécifier la source comme nom de pièce dans la mesure du possible. Le préfixe peut être n'importe quelle chaîne, mais il doit être unique. Une pièce signée ne peut pas avoir le même préfixe qu'une pièce chiffrée. Nous recommandons d'utiliser une valeur courte qui distingue la pièce des autres parties desservies par la balise composée.

Nous vous recommandons de définir vos pièces signées de manière globale dans la mesure du possible. Vous pouvez envisager de définir une pièce signée localement si vous avez l'intention de ne l'utiliser que dans une seule balise composée. Une pièce signée définie localement ne peut pas avoir le même préfixe ou le même nom qu'une pièce signée définie globalement.

Java
List<SignedPart> signedPartList = new ArrayList<>); SignedPart signedPartExample = SignedPart.builder() .name("signedFieldName") .prefix("S-") .build(); signedPartList.add(signedPartExample);
C# / .NET
var signedPartsList = new List<SignedPart> { new SignedPart { Name = "signedFieldName1", Prefix = "S-" }, new SignedPart { Name = "signedFieldName2", Prefix = "SF-" } };
Liste des constructeurs

Identifie les constructeurs qui définissent les différentes manières dont les pièces cryptées et signées peuvent être assemblées par la balise composée. Vous pouvez référencer des pièces locales et globales dans votre liste de constructeurs.

Si vous créez votre balise composée à partir de pièces chiffrées et signées définies globalement, vous devez fournir une liste de constructeurs.

Si vous n'utilisez aucune pièce chiffrée ou signée définie globalement pour construire votre balise composée, la liste des constructeurs est facultative. Si vous ne spécifiez pas de liste de constructeurs, le SDK AWS Database Encryption assemble la balise composée avec le constructeur par défaut suivant.

  • Toutes les pièces signées dans l'ordre dans lequel elles ont été ajoutées à la liste des pièces signées

  • Toutes les pièces cryptées dans l'ordre dans lequel elles ont été ajoutées à la liste des pièces cryptées

  • Toutes les pièces sont requises

Constructeurs

Chaque constructeur est une liste ordonnée de pièces du constructeur qui définit une manière dont la balise composée peut être assemblée. Les pièces du constructeur sont assemblées dans l'ordre dans lequel elles sont ajoutées à la liste, chaque partie étant séparée par le caractère divisé spécifié.

Chaque partie du constructeur nomme une partie chiffrée ou une partie signée, et définit si cette partie est obligatoire ou facultative dans le constructeur. Par exemple, si vous souhaitez interroger une balise composée surField1,Field1.Field2, etField1.Field2.Field3, marquer Field2 et Field3 comme facultatif et créer un constructeur.

Chaque constructeur doit avoir au moins une pièce requise. Nous vous recommandons de rendre obligatoire la première partie de chaque constructeur afin que vous puissiez utiliser l'BEGINS_WITHopérateur dans vos requêtes.

Un constructeur réussit si toutes ses pièces requises sont présentes dans l'enregistrement. Lorsque vous écrivez un nouvel enregistrement, la balise composée utilise la liste des constructeurs pour déterminer si la balise peut être assemblée à partir des valeurs fournies. Il tente d'assembler la balise dans l'ordre dans lequel les constructeurs ont été ajoutés à la liste des constructeurs, et il utilise le premier constructeur qui réussit. Si aucun constructeur ne réussit, la balise n'est pas écrite dans l'enregistrement.

Tous les lecteurs et rédacteurs doivent spécifier le même ordre de constructeurs pour s'assurer que les résultats de leurs requêtes sont corrects.

Utilisez les procédures suivantes pour spécifier votre propre liste de constructeurs.

  1. Créez une partie constructeur pour chaque pièce chiffrée et pièce signée afin de définir si cette partie est requise ou non.

    Le nom de la partie constructeur doit être le nom de la balise standard ou du champ signé qu'il représente.

    Java
    ConstructorPart field1ConstructorPart = ConstructorPart.builder() .name("Field1") .required(true) .build();
    C# / .NET
    var field1ConstructorPart = new ConstructorPart { Name = "Field1", Required = true };
  2. Créez un constructeur pour chaque manière possible d'assembler la balise composée à l'aide des pièces du constructeur que vous avez créées à l'étape 1.

    Par exemple, si vous souhaitez effectuer une requête sur Field1.Field2.Field3 etField4.Field2.Field3, vous devez créer deux constructeurs. Field1et Field4 peuvent tous deux être requis car ils sont définis dans deux constructeurs distincts.

    Java
    // Create a list for Field1.Field2.Field3 queries List<ConstructorPart> field123ConstructorPartList = new ArrayList<>(); field123ConstructorPartList.add(field1ConstructorPart); field123ConstructorPartList.add(field2ConstructorPart); field123ConstructorPartList.add(field3ConstructorPart); Constructor field123Constructor = Constructor.builder() .parts(field123ConstructorPartList) .build(); // Create a list for Field4.Field2.Field1 queries List<ConstructorPart> field421ConstructorPartList = new ArrayList<>(); field421ConstructorPartList.add(field4ConstructorPart); field421ConstructorPartList.add(field2ConstructorPart); field421ConstructorPartList.add(field1ConstructorPart); Constructor field421Constructor = Constructor.builder() .parts(field421ConstructorPartList) .build();
    C# / .NET
    // Create a list for Field1.Field2.Field3 queries var field123ConstructorPartList = new Constructor { Parts = new List<ConstructorPart> { field1ConstructorPart, field2ConstructorPart, field3ConstructorPart } }; // Create a list for Field4.Field2.Field1 queries var field421ConstructorPartList = new Constructor { Parts = new List<ConstructorPart> { field4ConstructorPart, field2ConstructorPart, field1ConstructorPart } };
  3. Créez une liste de constructeurs qui inclut tous les constructeurs que vous avez créés à l'étape 2.

    Java
    List<Constructor> constructorList = new ArrayList<>(); constructorList.add(field123Constructor) constructorList.add(field421Constructor)
    C# / .NET
    var constructorList = new List<Constructor> { field123Constructor, field421Constructor };
  4. Spécifiez le constructorList moment où vous créez votre balise composée.