Verwenden von Paginierung und Sortierung in Spring Boot 4 mit CrudRepository und PagingAndSortingRepository auf JDBCJava

Java-Forum
Anonymous
 Verwenden von Paginierung und Sortierung in Spring Boot 4 mit CrudRepository und PagingAndSortingRepository auf JDBC

Post by Anonymous »

Ich lerne in der Spring Academy von Broadcom, um über die neuesten Best Practices auf dem Laufenden zu bleiben. Ich habe Spring Boot auf Spring Academy auf 4.0.0 statt auf 3.0.0 erhöht. Aber ich habe einige Probleme mit der PagingAndSortingRepository-Schnittstelle. Ich kann die Paginierung /demo?page=0&size=1 und die Sortierung /demo?sort=amount,desc erfolgreich verwenden, aber ich kann die Kombination /demo?page=0&size=1&sort=amount,desc nicht verwenden. Und ich kann nicht herausfinden, wie ich das mit JDBC beheben kann.
build.gradle

Code: Select all

plugins {
id 'java'
id 'org.springframework.boot' version '4.0.0'
id 'io.spring.dependency-management' version '1.1.7'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
description = 'Demo project for Spring Boot'

java {
sourceCompatibility = '17'
}

repositories {
mavenCentral()
}

dependencies {
// Rest API
implementation 'org.springframework.boot:spring-boot-starter-webmvc'
testImplementation 'org.springframework.boot:spring-boot-starter-webmvc-test'

// Database
implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
runtimeOnly 'com.h2database:h2'

// Security
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity6'
testImplementation 'org.springframework.security:spring-security-test'

// Test
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}

tasks.named('test') {
useJUnitPlatform()
}

test {
testLogging {
events "passed", "skipped", "failed" //, "standardOut", "standardError"

showExceptions true
exceptionFormat "full"
showCauses true
showStackTraces true

// Change from false to true
showStandardStreams = true
}
}
DemoRepository.java

Code: Select all

interface DemoRepository extends CrudRepository, PagingAndSortingRepository {
boolean existsByIdAndOwner(Long id, String owner);

Demo findByIdAndOwner(Long id, String owner);

Page findByOwner(String owner, Pageable pageable);
}
DemoController.java
(Ich habe die auf der Spring Academy vorgeschlagene problematische Zeile kommentiert und durch die einfachere oben ersetzt.)

Code: Select all

    @GetMapping
private ResponseEntity readDemos(Pageable pageable, Principal principal) {
Page page = demoRepository.findByOwner(principal.getName(),
PageRequest.of(
pageable.getPageNumber(),
pageable.getPageSize(),
pageable.getSort()
// pageable.getSortOr(Sort.by(Sort.Direction.ASC, "amount"))
));

return ResponseEntity.ok(page.getContent());
}
DemoApplicationTests.java
(Wenn ich den vorherigen Code verwende, funktioniert es einwandfrei. Wenn ich jedoch die auskommentierte Zeile verwende, bricht sie ab.)

Code: Select all

 @Test
void readDemos_sorting() {
EntityExchangeResult result = client.get()
.uri("/demo?page=0&size=1&sort=amount,desc")
.header(HttpHeaders.AUTHORIZATION, authHeader)
.exchange()
.expectStatus()
.isOk()
.expectHeader()
.contentTypeCompatibleWith(MediaType.APPLICATION_JSON)
.expectBody(String.class)
.returnResult();

String responseBody = result.getResponseBody();

DocumentContext documentContext = JsonPath.parse(responseBody);
JSONArray read = documentContext.read("$[*]");
assertThat(read.size()).isEqualTo(3);

double amount = documentContext.read("$[0].amount");
assertThat(amount).isEqualTo(150.00);
}
Fehler bei Verwendung der auskommentierten Zeile:

Code: Select all

org.h2.jdbc.JdbcSQLSyntaxErrorException: Column "DEMO.AMOUNT" must be in the GROUP BY list; SQL statement:
SELECT COUNT(*) FROM "DEMO" WHERE "DEMO"."OWNER" = ? ORDER BY "DEMO"."AMOUNT" ASC [90016-240]
Außerdem schlagen andere Tests, die die Sortierlogik testen, fehl, wohingegen sie funktionieren, wenn ich pageable.getSort() verwende.
Einerseits kann ich pageable.getSort() verwenden, um einen Standardaufruf ohne Sortierparameter zu unterstützen; es unterstützt auch Sortierparameter; aber ich kann diese Sortierparameter nicht mit den Paginierungsparametern kombinieren, sonst schlägt es fehl.
Wenn ich andererseits pageable.getSortOr(Sort.by(Sort.Direction.ASC, "amount")) verwende, schlägt die gesamte Sortierung fehl, und wenn ich Paginierungsparameter ohne Sortierparameter verwende, erhalte ich diesen SQL-Fehler.
Sehen Sie sich den vollständigen Code auf GitHub an

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post