Oefening: een query uitvoeren met de Azure Cosmos DB Java SDK
U hebt documenten in uw toepassing gemaakt. We gaan er nu een query op uitvoeren vanuit de toepassing. De Azure Cosmos DB Java SDK maakt gebruik van SQL-query's. De .NET SDK biedt extra ondersteuning voor LINQ-query's, maar de Java SDK heeft geen analoog. In deze eenheid richten we ons op het uitvoeren van SQL-query's vanuit de toepassing, in plaats van via de portal.
We gebruiken de documenten van de gebruikers die u voor uw online-retailtoepassing hebt gemaakt om deze query's te testen.
SQL-query's uitvoeren
In het volgende voorbeeld wordt getoond hoe een query in SQL kan worden uitgevoerd via uw Java-code. Kopieer de code en voeg deze toe aan het einde van het bestand CosmosApp.java.
/** * Execute a custom query on the Azure Cosmos DB container. * @param query Query String. */ private static void executeSimpleQuery(final String query) { final int preferredPageSize = 10; CosmosQueryRequestOptions queryOptions = new CosmosQueryRequestOptions(); CosmosPagedFlux<User> pagedFluxResponse = container.queryItems( query, queryOptions, User.class); logger.info("Running SQL query..."); pagedFluxResponse.byPage(preferredPageSize).flatMap(fluxResponse -> { logger.info("Got a page of query result with " + fluxResponse.getResults().size() + " items(s) and request charge of " + fluxResponse.getRequestCharge()); logger.info("Item Ids " + fluxResponse .getResults() .stream() .map(User::getId) .collect(Collectors.toList())); return Flux.empty(); }).blockLast(); }
In deze code ziet u dat we weer eens gebruikmaken van het programmeermodel met declaratieve gegevensstromen van Project Reactor. Deze keer gebruiken we het model om pagina's met queryreacties asynchroon af te handelen. We gebruiken een asynchrone benadering, omdat er in een echte use case honderden of duizenden reacties op een query kunnen zijn. Het samenvoegen van queryreacties kan een CPU-intensieve taak zijn die gebruik kan maken van de verhoogde threadefficiëntie van asynchrone programmering.
Kortom, we willen een hoge doorvoer voor de verwerking van queryreacties, of een groot aantal pagina's per seconde per thread.
queryitems
retourneert hetCosmosPagedFlux
-exemplaarpagedFluxResponse
en metpagedFluxResponse.byPage(preferredPageSize)
wordt eenFlux
-exemplaar gemaakt, dat fungeert als bron van asynchrone paginagebeurtenissen. De pijplijn van bewerkingen binnen.flatMap( ... ).blockLast();
werkt asynchroon en pseudoparallel op de pagina voor queryreacties die gekoppeld is aan elke gebeurtenis die wordt verzonden door hetFlux
-exemplaar.Kopieer de volgende code en plak deze in de methode
basicOperations
, vóór de code voor de verwijdering van een document.executeSimpleQuery("SELECT * FROM User WHERE User.lastName = 'Pindakova'");
Zorg dat u CosmosApp.java bouwt en uitvoert in de IDE of voer het programma uit in de terminal met behulp van:
mvn clean package mvn exec:java -Dexec.mainClass="com.azure.cosmos.examples.mslearnbasicapp.CosmosApp"
De uitvoer in de terminal ziet er ongeveer als volgt uit:
INFO: Database and container validation complete INFO: User 1 already exists in the database INFO: User 2 already exists in the database INFO: Read User 1 INFO: Replaced last name for Suh INFO: Running SQL query... INFO: Got a page of query result with 1 items(s) and request charge of 2.83 INFO: Item Ids [2] INFO: Deleted User 1
U hebt documenten in uw toepassing gemaakt. We gaan er nu een query op uitvoeren vanuit de toepassing. Spring Data Azure Cosmos DB geeft zowel afgeleide querymethoden als aangepaste querymethoden weer. Beide methoden bouwen op de querymogelijkheden binnen de SQL-taal van de onderliggende Azure Cosmos DB Java SDK v4. In deze les richten we ons op het uitvoeren van Spring Data Azure Cosmos DB-query's vanuit de toepassing, in plaats van vanuit de portal.
We gebruiken de WebCustomer
-documenten die u voor uw online retailtoepassing hebt gemaakt om deze query's te testen.
Afgeleide querymethoden maken en aanroepen
Afgeleide querymethoden zijn Spring Data opslagplaatsmethoden zonder implementatie. In plaats van implementatie signaleert de naam van de methode Spring Data om elke methodeaanroep en diens argumenten te vertalen. Uit de vertaling volgt een query die op de onderliggende database wordt uitgevoerd. Wanneer u bijvoorbeeld findById
aanroept met een aantal argumenten, leest Spring Data de naam van de methode als ' zoeken op id' en wordt er een databasequery opgezet. De query retourneert het document dat is opgegeven door de argumenten.
Spring Data Azure Cosmos DB bevat een aantal ingebouwde afgeleide querymethoden met inbegrip van findById
. In deze sectie wordt weergegeven hoe u nieuwe afgeleide querymethoden kunt implementeren.
We maken een afgeleide querymethode waarmee alle documenten met een bepaalde waarde voor het veld
firstName
worden doorzocht. Ga naar ReactiveWebCustomerRepository.java. U ziet de volgende methodedeclaratie:Flux<WebCustomer> findByFirstName(String firstName);
Deze opslagplaatsmethode declareert tot Spring Data dat u een methode wilt die query's op
firstName
uitvoert wanneer deze wordt aangeroepen. Denk eraan dat de klasseWebCustomer
begon met een@Container
aantekening diecontainerName
specificeerde alsWebCustomers
. OmdatfindByFirstName
Flux<WebCustomer>
retourneert, weet Spring Data dat de gegevensWebCustomers
moeten worden opgevraagd wanneer deze methode wordt aangeroepen.Kopieer de volgende code en plak deze in de methode
run
, vóór de aanroepdeleteWebCustomerDocument
.logger.info("Running derived query..."); Flux<WebCustomer> webCustomers = reactiveWebCustomerRepository.findByFirstName("Max"); webCustomers.flatMap(webCustomer -> { logger.info("- WebCustomer is : {}", webCustomer.getUserId()); return Mono.empty(); }).blockLast();
In deze code ziet u dat we weer eens gebruikmaken van het programmeermodel met declaratieve gegevensstromen van Project Reactor. Deze keer gebruiken we het model om pagina's met queryreacties asynchroon af te handelen. We gebruiken een asynchrone benadering, omdat er in een echte use case honderden of duizenden reacties op een query kunnen zijn. Het samenvoegen van queryreacties kan een CPU-intensieve taak zijn die gebruik kan maken van de verhoogde threadefficiëntie van asynchrone programmering.
Kortom, we willen een hoge doorvoer voor de verwerking van queryreacties, of een groot aantal reacties per seconde per thread.
findByFirstName
retourneert hetFlux<WebCustomer>
-exemplaarwebCustomers
. De pijplijn van bewerkingen binnen.flatMap( ... ).blockLast();
werkt asynchroon en pseudoparallel op de queryreacties die zijn gekoppeld aan elke gebeurtenis die wordt verzonden door deFlux<WebCustomer>
.Bouw CosmosSample.java en voer die uit in de IDE, of voer het programma uit in de terminal met behulp van:
mvn clean package mvn spring-boot:run
De uitvoer in de terminal ziet er ongeveer als volgt uit:
INFO: - WebCustomer is : maxaxam
Aangepaste querymethoden maken en aanroepen
Aangepaste querymethoden bestaan uit opslagplaatsmethoden met een @Query
aantekening. Hiermee wordt een queryreeks opgegeven. De queryreeks bevat tijdelijke aanduidingen voor de argumenten van de methoden. Deze keer heeft de naam van de methode geen invloed op de query die wordt uitgevoerd. De aantekening @Query
geeft Spring Data een signaal om een query in SQL-taal uit te geven aan de onderliggende database nadat de tijdelijke aanduidingen voor argumenten zijn gevuld met de waarden van de methodeargumenten.
We maken een aangepaste querymethode waarmee alle documenten met een bepaalde waarde voor het veld
lastName
worden doorzocht. Ga naar ReactiveWebCustomerRepository.java. U ziet de volgende methodedeclaratie:@Query(value = "SELECT * FROM User WHERE User.lastName = @lastName") Flux<WebCustomer> findByLastName(@Param("lastName") String lastName);
Deze opslagplaatsmethode declareert tot Spring Data dat u een methode wilt die query's op
lastName
uitvoert wanneer deze wordt aangeroepen. De waarde van het argumentlastName
wordt vervangen door de tijdelijke aanduiding@lastName
.Kopieer de volgende code en plak deze in uw methode
run
, na de afgeleide querycode.logger.info("Running custom query..."); webCustomers = reactiveWebCustomerRepository.findByLastName("Axam"); webCustomers.flatMap(webCustomer -> { logger.info("- WebCustomer is : {}", webCustomer.getUserId()); return Mono.empty(); }).blockLast();
Bouw CosmosSample.java en voer die uit in de IDE, of voer het programma uit in de terminal met behulp van:
mvn clean package mvn spring-boot:run
De uitvoer in de terminal ziet er ongeveer als volgt uit:
INFO: Running derived query... INFO: - WebCustomer is : maxaxam INFO: Running custom query... INFO: - WebCustomer is : maxaxam
In deze les hebt u geleerd over afgeleide en aangepaste query's. Vervolgens hebt u een beide querytypes aan uw toepassing toegevoegd om gebruikersrecords op te halen.