build.gradle
Код: Выделить всё
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
}
}
Код: Выделить всё
interface DemoRepository extends CrudRepository, PagingAndSortingRepository {
boolean existsByIdAndOwner(Long id, String owner);
Demo findByIdAndOwner(Long id, String owner);
Page findByOwner(String owner, Pageable pageable);
}
(Я прокомментировал проблемную строку, предложенную в Spring Academy, и заменил ее более простой выше.)
Код: Выделить всё
@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());
}
(Если я использую предыдущий код, он работает нормально. Но если я использую закомментированную строку, он ломается.)
Код: Выделить всё
@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);
}
Код: Выделить всё
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]
С одной стороны, я могу использовать pageable.getSort() для поддержки вызова по умолчанию без каких-либо параметров сортировки; он также поддерживает параметры сортировки; но я не могу объединить эти параметры сортировки с параметрами разбивки на страницы, иначе это не удастся.
С другой стороны, если я использую pageable.getSortOr(Sort.by(Sort.Direction.ASC, "amount")), вся сортировка завершается неудачно, и если я использую параметры разбивки на страницы без параметров сортировки, я получаю эту ошибку SQL.
Просмотреть полный код на GitHub
Подробнее здесь: https://stackoverflow.com/questions/798 ... ngandsorti
Мобильная версия