Skip to content

Commit f1ad2bc

Browse files
committed
Spring Boot 3.5 to 4.0
1 parent bd0efb2 commit f1ad2bc

16 files changed

Lines changed: 330 additions & 212 deletions

File tree

.devcontainer/devcontainer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
"vscjava.vscode-java-pack",
2727
"vscjava.vscode-gradle",
2828
"vscjava.vscode-spring-boot-dashboard",
29-
"redhat.java@1.41.1",
29+
"redhat.java@1.47.0",
3030
"pivotal.vscode-spring-boot",
3131
"pivotal.vscode-boot-dev-pack"
3232
]

build.gradle

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
plugins {
22
id 'java'
3-
id 'org.springframework.boot' version '3.5.0'
3+
id 'org.springframework.boot' version '4.0.0'
44
id 'io.spring.dependency-management' version '1.1.7'
55
}
66

7-
version = "3.5.0"
7+
version = "4.0.0"
88

99
javadoc {
1010
options.addBooleanOption('Xdoclint:none', true)
@@ -26,17 +26,18 @@ repositories {
2626
dependencies {
2727
annotationProcessor "org.projectlombok:lombok"
2828
compileOnly "org.projectlombok:lombok"
29-
implementation "org.springframework.boot:spring-boot-starter-web"
29+
implementation "org.springframework.boot:spring-boot-starter-actuator"
30+
implementation 'org.springframework.boot:spring-boot-starter-webmvc'
3031
implementation "org.springframework.boot:spring-boot-starter-data-jdbc"
3132
implementation "org.springframework.boot:spring-boot-starter-validation"
32-
implementation "org.springframework.boot:spring-boot-starter-aop"
33-
implementation "org.springframework.boot:spring-boot-starter-actuator"
33+
implementation "org.springframework.boot:spring-boot-starter-aspectj"
3434
runtimeOnly "com.h2database:h2"
3535
testAnnotationProcessor "org.projectlombok:lombok"
36-
testCompileOnly "org.projectlombok:lombok"
37-
testImplementation "org.springframework.boot:spring-boot-starter-test"
36+
testImplementation 'org.springframework.boot:spring-boot-starter-webmvc-test'
37+
testImplementation 'org.springframework.boot:spring-boot-starter-data-jdbc-test'
38+
testRuntimeOnly 'com.h2database:h2'
3839
}
3940

4041
wrapper {
41-
gradleVersion = "8.14.1"
42+
gradleVersion = "9.2.1"
4243
}

gradle/wrapper/gradle-wrapper.jar

1.83 KB
Binary file not shown.

gradle/wrapper/gradle-wrapper.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
distributionBase=GRADLE_USER_HOME
22
distributionPath=wrapper/dists
3-
distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.1-bin.zip
3+
distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.1-bin.zip
44
networkTimeout=10000
55
validateDistributionUrl=true
66
zipStoreBase=GRADLE_USER_HOME

gradlew

Lines changed: 1 addition & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

gradlew.bat

Lines changed: 1 addition & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
package sample.context.orm;
2+
3+
import java.util.List;
4+
import java.util.Map;
5+
6+
import org.springframework.data.domain.PageImpl;
7+
import org.springframework.data.domain.PageRequest;
8+
import org.springframework.data.jdbc.core.convert.EntityRowMapper;
9+
import org.springframework.data.jdbc.core.convert.JdbcConverter;
10+
import org.springframework.data.relational.core.mapping.RelationalMappingContext;
11+
import org.springframework.data.relational.core.mapping.RelationalPersistentEntity;
12+
import org.springframework.data.web.PagedModel;
13+
import org.springframework.jdbc.core.RowMapper;
14+
import org.springframework.jdbc.core.simple.JdbcClient;
15+
import org.springframework.stereotype.Component;
16+
17+
import lombok.RequiredArgsConstructor;
18+
19+
/**
20+
* Wrapper utility component that encapsulates JdbcClient.
21+
* <p>
22+
* For typical use cases, use find which does not depend on Spring Data.
23+
* For table-mapped entities, use findEntity.
24+
*/
25+
@Component
26+
@RequiredArgsConstructor(staticName = "of")
27+
public class JdbcFinder {
28+
private final JdbcClient jdbcClient;
29+
private final JdbcConverter jdbcConverter;
30+
private final RelationalMappingContext mappingContext;
31+
32+
/** Gets the JdbcClient. */
33+
public JdbcClient client() {
34+
return jdbcClient;
35+
}
36+
37+
/** Performs a simple search. */
38+
public <T> List<T> find(Class<T> type, SqlBuilder sqlBuilder) {
39+
return jdbcClient.sql(sqlBuilder.build())
40+
.params(sqlBuilder.params())
41+
.query(type)
42+
.list();
43+
}
44+
45+
/** Performs a simple search. */
46+
public <T> List<T> find(Class<T> type, RowMapper<T> rowMapper, SqlBuilder sqlBuilder) {
47+
return jdbcClient.sql(sqlBuilder.build())
48+
.params(sqlBuilder.params())
49+
.query(rowMapper)
50+
.list();
51+
}
52+
53+
/** Performs a simple search. (Spring Data compatible) */
54+
public <T> List<T> findEntity(Class<T> type, SqlBuilder sqlBuilder) {
55+
return jdbcClient.sql(sqlBuilder.build())
56+
.params(sqlBuilder.params())
57+
.query(createEntityRowMapper(type))
58+
.list();
59+
}
60+
61+
@SuppressWarnings("unchecked")
62+
private <T> RowMapper<T> createEntityRowMapper(Class<T> type) {
63+
if (mappingContext == null || jdbcConverter == null) {
64+
throw new IllegalStateException(
65+
"JdbcFinder is not properly initialized for EntityRowMapper. (not found mappingContext or jdbcConverter)");
66+
}
67+
RelationalPersistentEntity<T> entity = (RelationalPersistentEntity<T>) mappingContext
68+
.getRequiredPersistentEntity(type);
69+
return new EntityRowMapper<>(entity, jdbcConverter);
70+
}
71+
72+
/** Performs a paged search. */
73+
public <T> PagedModel<T> find(Class<T> type, SqlBuilder sqlBuilder, Integer page, Integer size) {
74+
var pageRequest = PageRequest.of(page != null ? page : 0, size != null ? size : 100);
75+
String countSql = sqlBuilder.buildCount();
76+
String sql = sqlBuilder.build(pageRequest);
77+
Map<String, Object> params = sqlBuilder.params();
78+
Long total = jdbcClient.sql(countSql)
79+
.params(params)
80+
.query(Long.class)
81+
.single();
82+
List<T> list = jdbcClient.sql(sql)
83+
.params(params)
84+
.query(type)
85+
.list();
86+
return new PagedModel<>(new PageImpl<>(list, pageRequest, total));
87+
}
88+
89+
/** Performs a paged search. */
90+
public <T> PagedModel<T> find(
91+
Class<T> type,
92+
RowMapper<T> rowMapper,
93+
SqlBuilder sqlBuilder,
94+
Integer page,
95+
Integer size) {
96+
var pageRequest = PageRequest.of(page != null ? page : 0, size != null ? size : 100);
97+
String countSql = sqlBuilder.buildCount();
98+
String sql = sqlBuilder.build(pageRequest);
99+
Map<String, Object> params = sqlBuilder.params();
100+
Long total = jdbcClient.sql(countSql)
101+
.params(params)
102+
.query(Long.class)
103+
.single();
104+
List<T> list = jdbcClient.sql(sql)
105+
.params(params)
106+
.query(rowMapper)
107+
.list();
108+
return new PagedModel<>(new PageImpl<>(list, pageRequest, total));
109+
}
110+
111+
/** Performs a paged search. (Spring Data compatible) */
112+
public <T> PagedModel<T> findEntity(Class<T> type, SqlBuilder sqlBuilder, Integer page, Integer size) {
113+
var pageRequest = PageRequest.of(page != null ? page : 0, size != null ? size : 100);
114+
String countSql = sqlBuilder.buildCount();
115+
String sql = sqlBuilder.build(pageRequest);
116+
Map<String, Object> params = sqlBuilder.params();
117+
Long total = jdbcClient.sql(countSql)
118+
.params(params)
119+
.query(Long.class)
120+
.single();
121+
List<T> list = jdbcClient.sql(sql)
122+
.params(params)
123+
.query(createEntityRowMapper(type))
124+
.list();
125+
return new PagedModel<>(new PageImpl<>(list, pageRequest, total));
126+
}
127+
128+
public static JdbcFinder of(JdbcClient jdbcClient) {
129+
return new JdbcFinder(jdbcClient, null, null);
130+
}
131+
132+
}

src/main/java/sample/context/orm/MatchMode.java

Lines changed: 0 additions & 20 deletions
This file was deleted.

src/main/java/sample/context/orm/OrmTemplate.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,7 @@ public <T> Page<T> find(Class<T> clazz,
205205
* @param pageable Pagination information
206206
* @return Page of entities
207207
*/
208+
@SuppressWarnings("removal")
208209
public <T> Page<T> find(Class<T> clazz, String propertyName, Object value, Pageable pageable) {
209210
if (value == null) {
210211
return template.findAll(clazz, pageable);
@@ -227,6 +228,7 @@ public <T> Page<T> find(Class<T> clazz, String propertyName, Object value, Pagea
227228
* @param pageable Pagination information
228229
* @return Page of entities
229230
*/
231+
@SuppressWarnings("removal")
230232
public <T> Page<T> find(Class<T> clazz, Map<String, Object> conditions, Pageable pageable) {
231233
if (conditions == null || conditions.isEmpty()) {
232234
return template.findAll(clazz, pageable);
@@ -258,6 +260,7 @@ public <T> List<T> findAll(Class<T> clazz) {
258260
* @param pageable Pagination information
259261
* @return Page of entities
260262
*/
263+
@SuppressWarnings("removal")
261264
public <T> Page<T> findAll(Class<T> clazz, Pageable pageable) {
262265
return template.findAll(clazz, pageable);
263266
}

0 commit comments

Comments
 (0)