diff --git a/apache-kafka/pom.xml b/apache-kafka/pom.xml
index 7bde041f32..915583fed8 100644
--- a/apache-kafka/pom.xml
+++ b/apache-kafka/pom.xml
@@ -35,12 +35,12 @@
org.apache.flink
- flink-connector-kafka-0.11_2.11
+ flink-connector-kafka
${flink.version}
org.apache.flink
- flink-streaming-java_2.11
+ flink-streaming-java
${flink.version}
@@ -67,7 +67,7 @@
org.apache.flink
- flink-test-utils_2.11
+ flink-test-utils
${flink.version}
test
@@ -163,11 +163,29 @@
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+
+ --add-opens java.base/java.time=ALL-UNNAMED
+ --add-opens java.base/java.nio=ALL-UNNAMED
+ --add-opens java.base/java.util=ALL-UNNAMED
+
+
+
+
+
+
+
+
- 2.8.0
+ 3.4.0
1.15.3
1.15.3
- 1.5.0
+ 1.16.1
3.0.0
2.4.8
0.8.1-spark3.0-s_2.12
diff --git a/apache-kafka/src/main/java/com/baeldung/flink/FlinkDataPipeline.java b/apache-kafka/src/main/java/com/baeldung/flink/FlinkDataPipeline.java
index 4502b628b2..8d15b79a63 100644
--- a/apache-kafka/src/main/java/com/baeldung/flink/FlinkDataPipeline.java
+++ b/apache-kafka/src/main/java/com/baeldung/flink/FlinkDataPipeline.java
@@ -9,8 +9,8 @@ import org.apache.flink.streaming.api.TimeCharacteristic;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.windowing.time.Time;
-import org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer011;
-import org.apache.flink.streaming.connectors.kafka.FlinkKafkaProducer011;
+import org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer;
+import org.apache.flink.streaming.connectors.kafka.FlinkKafkaProducer;
import static com.baeldung.flink.connector.Consumers.*;
import static com.baeldung.flink.connector.Producers.*;
@@ -25,12 +25,12 @@ public class FlinkDataPipeline {
StreamExecutionEnvironment environment = StreamExecutionEnvironment.getExecutionEnvironment();
- FlinkKafkaConsumer011 flinkKafkaConsumer = createStringConsumerForTopic(inputTopic, address, consumerGroup);
+ FlinkKafkaConsumer flinkKafkaConsumer = createStringConsumerForTopic(inputTopic, address, consumerGroup);
flinkKafkaConsumer.setStartFromEarliest();
DataStream stringInputStream = environment.addSource(flinkKafkaConsumer);
- FlinkKafkaProducer011 flinkKafkaProducer = createStringProducer(outputTopic, address);
+ FlinkKafkaProducer flinkKafkaProducer = createStringProducer(outputTopic, address);
stringInputStream.map(new WordsCapitalizer())
.addSink(flinkKafkaProducer);
@@ -48,11 +48,11 @@ public class FlinkDataPipeline {
environment.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);
- FlinkKafkaConsumer011 flinkKafkaConsumer = createInputMessageConsumer(inputTopic, kafkaAddress, consumerGroup);
+ FlinkKafkaConsumer flinkKafkaConsumer = createInputMessageConsumer(inputTopic, kafkaAddress, consumerGroup);
flinkKafkaConsumer.setStartFromEarliest();
flinkKafkaConsumer.assignTimestampsAndWatermarks(new InputMessageTimestampAssigner());
- FlinkKafkaProducer011 flinkKafkaProducer = createBackupProducer(outputTopic, kafkaAddress);
+ FlinkKafkaProducer flinkKafkaProducer = createBackupProducer(outputTopic, kafkaAddress);
DataStream inputMessagesStream = environment.addSource(flinkKafkaConsumer);
diff --git a/apache-kafka/src/main/java/com/baeldung/flink/connector/Consumers.java b/apache-kafka/src/main/java/com/baeldung/flink/connector/Consumers.java
index c72cb8a2d6..358c9627f7 100644
--- a/apache-kafka/src/main/java/com/baeldung/flink/connector/Consumers.java
+++ b/apache-kafka/src/main/java/com/baeldung/flink/connector/Consumers.java
@@ -3,26 +3,26 @@ package com.baeldung.flink.connector;
import com.baeldung.flink.model.InputMessage;
import com.baeldung.flink.schema.InputMessageDeserializationSchema;
import org.apache.flink.api.common.serialization.SimpleStringSchema;
-import org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer011;
+import org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer;
import java.util.Properties;
public class Consumers {
- public static FlinkKafkaConsumer011 createStringConsumerForTopic(String topic, String kafkaAddress, String kafkaGroup) {
+ public static FlinkKafkaConsumer createStringConsumerForTopic(String topic, String kafkaAddress, String kafkaGroup) {
Properties props = new Properties();
props.setProperty("bootstrap.servers", kafkaAddress);
props.setProperty("group.id", kafkaGroup);
- FlinkKafkaConsumer011 consumer = new FlinkKafkaConsumer011<>(topic, new SimpleStringSchema(), props);
+ FlinkKafkaConsumer consumer = new FlinkKafkaConsumer<>(topic, new SimpleStringSchema(), props);
return consumer;
}
- public static FlinkKafkaConsumer011 createInputMessageConsumer(String topic, String kafkaAddress, String kafkaGroup) {
+ public static FlinkKafkaConsumer createInputMessageConsumer(String topic, String kafkaAddress, String kafkaGroup) {
Properties properties = new Properties();
properties.setProperty("bootstrap.servers", kafkaAddress);
properties.setProperty("group.id", kafkaGroup);
- FlinkKafkaConsumer011 consumer = new FlinkKafkaConsumer011(topic, new InputMessageDeserializationSchema(), properties);
+ FlinkKafkaConsumer consumer = new FlinkKafkaConsumer(topic, new InputMessageDeserializationSchema(), properties);
return consumer;
}
diff --git a/apache-kafka/src/main/java/com/baeldung/flink/connector/Producers.java b/apache-kafka/src/main/java/com/baeldung/flink/connector/Producers.java
index 8e6f3f8f37..a4cb2d70c2 100644
--- a/apache-kafka/src/main/java/com/baeldung/flink/connector/Producers.java
+++ b/apache-kafka/src/main/java/com/baeldung/flink/connector/Producers.java
@@ -3,15 +3,15 @@ package com.baeldung.flink.connector;
import com.baeldung.flink.model.Backup;
import com.baeldung.flink.schema.BackupSerializationSchema;
import org.apache.flink.api.common.serialization.SimpleStringSchema;
-import org.apache.flink.streaming.connectors.kafka.FlinkKafkaProducer011;
+import org.apache.flink.streaming.connectors.kafka.FlinkKafkaProducer;
public class Producers {
- public static FlinkKafkaProducer011 createStringProducer(String topic, String kafkaAddress) {
- return new FlinkKafkaProducer011<>(kafkaAddress, topic, new SimpleStringSchema());
+ public static FlinkKafkaProducer createStringProducer(String topic, String kafkaAddress) {
+ return new FlinkKafkaProducer<>(kafkaAddress, topic, new SimpleStringSchema());
}
- public static FlinkKafkaProducer011 createBackupProducer(String topic, String kafkaAddress) {
- return new FlinkKafkaProducer011(kafkaAddress, topic, new BackupSerializationSchema());
+ public static FlinkKafkaProducer createBackupProducer(String topic, String kafkaAddress) {
+ return new FlinkKafkaProducer(kafkaAddress, topic, new BackupSerializationSchema());
}
}
diff --git a/feign/pom.xml b/feign/pom.xml
index 7338cf7508..f39adec607 100644
--- a/feign/pom.xml
+++ b/feign/pom.xml
@@ -103,7 +103,7 @@
com.baeldung.feign.soap
- src/main/resources/users.xsd
+ ${project.basedir}/src/main/resources/users.xsd
diff --git a/jetbrains/README.md b/jetbrains/README.md
new file mode 100644
index 0000000000..a63d4dffba
--- /dev/null
+++ b/jetbrains/README.md
@@ -0,0 +1,5 @@
+## Jetbrains
+
+This module contains articles about Jetbrains' libraries.
+
+### Relevant articles:
diff --git a/jetbrains/pom.xml b/jetbrains/pom.xml
new file mode 100644
index 0000000000..a10fd3b913
--- /dev/null
+++ b/jetbrains/pom.xml
@@ -0,0 +1,37 @@
+
+
+ 4.0.0
+ jetbrains
+ 1.0-SNAPSHOT
+ jetbrains
+ jar
+ http://maven.apache.org
+
+
+ com.baeldung
+ parent-java
+ 0.0.1-SNAPSHOT
+ ../parent-java
+
+
+
+
+ org.apache.commons
+ commons-lang3
+ ${apache.commons.version}
+
+
+ org.jetbrains
+ annotations
+ ${jetbrains.annotations.version}
+
+
+
+
+ 3.12.0
+ 24.0.1
+
+
+
\ No newline at end of file
diff --git a/jetbrains/src/main/java/com/baeldung/annotations/Demo.java b/jetbrains/src/main/java/com/baeldung/annotations/Demo.java
new file mode 100644
index 0000000000..3638d13581
--- /dev/null
+++ b/jetbrains/src/main/java/com/baeldung/annotations/Demo.java
@@ -0,0 +1,112 @@
+package com.baeldung.annotations;
+
+import java.util.List;
+
+import org.apache.commons.lang3.StringUtils;
+import org.jetbrains.annotations.Contract;
+
+public class Demo {
+
+ @Contract("_ -> new")
+ Person fromName(String name) {
+ return new Person().withName(name);
+ }
+
+ @Contract(" -> fail")
+ void alwaysFail() {
+ throw new RuntimeException();
+ }
+
+ @Contract(" -> fail")
+ void doNothingWithWrongContract() {
+
+ }
+
+ @Contract("_, null -> null; null, _ -> param2; _, !null -> !null")
+ String concatenateOnlyIfSecondArgumentIsNotNull(String head, String tail) {
+ if (tail == null) {
+ return null;
+ }
+ if (head == null) {
+ return tail;
+ }
+ return head + tail;
+ }
+
+ void uselessNullCheck() {
+ String head = "1234";
+ String tail = "5678";
+ String concatenation = concatenateOnlyIfSecondArgumentIsNotNull(head, tail);
+ if (concatenation != null) {
+ System.out.println(concatenation);
+ }
+ }
+
+ void uselessNullCheckOnInferredAnnotation() {
+ if (StringUtils.isEmpty(null)) {
+ System.out.println("baeldung");
+ }
+ }
+
+ @Contract(pure = true)
+ String replace(String string, char oldChar, char newChar) {
+ return string.replace(oldChar, newChar);
+ }
+
+ @Contract(value = "true -> false; false -> true", pure = true)
+ boolean not(boolean input) {
+ return !input;
+ }
+
+ @Contract("true -> new")
+ void contractExpectsWrongParameterType(List integers) {
+
+ }
+
+ @Contract("_, _ -> new")
+ void contractExpectsMoreParametersThanMethodHas(String s) {
+
+ }
+
+ @Contract("_ -> _; null -> !null")
+ String secondContractClauseNotReachable(String s) {
+ return "";
+ }
+
+ @Contract("_ -> true")
+ void contractExpectsWrongReturnType(String s) {
+
+ }
+
+ // NB: the following examples demonstrate how to use the mutates attribute of the annotation
+ // This attribute is currently experimental and could be changed or removed in the future
+ @Contract(mutates = "param")
+ void incrementArrayFirstElement(Integer[] integers) {
+ if (integers.length > 0) {
+ integers[0] = integers[0] + 1;
+ }
+ }
+
+ @Contract(pure = true, mutates = "param")
+ void impossibleToMutateParamInPureFunction(List strings) {
+ if (strings != null) {
+ strings.forEach(System.out::println);
+ }
+ }
+
+ @Contract(mutates = "param3")
+ void impossibleToMutateThirdParamWhenMethodHasOnlyTwoParams(int a, int b) {
+
+ }
+
+ @Contract(mutates = "param")
+ void impossibleToMutableImmutableType(String s) {
+
+ }
+
+ @Contract(mutates = "this")
+ static void impossibleToMutateThisInStaticMethod() {
+
+ }
+
+}
diff --git a/jetbrains/src/main/java/com/baeldung/annotations/Person.java b/jetbrains/src/main/java/com/baeldung/annotations/Person.java
new file mode 100644
index 0000000000..086b73b47f
--- /dev/null
+++ b/jetbrains/src/main/java/com/baeldung/annotations/Person.java
@@ -0,0 +1,15 @@
+package com.baeldung.annotations;
+
+import org.jetbrains.annotations.Contract;
+
+public class Person {
+
+ String name;
+
+ @Contract("_ -> this")
+ Person withName(String name) {
+ this.name = name;
+ return this;
+ }
+
+}
diff --git a/jmeter/pom.xml b/jmeter/pom.xml
index acd823b74f..d349fc526b 100644
--- a/jmeter/pom.xml
+++ b/jmeter/pom.xml
@@ -48,8 +48,15 @@
com.lazerycode.jmeter
jmeter-maven-plugin
- ${jmeter.version}
+ 3.7.0
+
+
+ configuration
+
+ configure
+
+
jmeter-tests
@@ -66,7 +73,6 @@
- 2.6.0
diff --git a/jmeter/src/main/resources/FileExtractionExample.jmx b/jmeter/src/main/resources/FileExtractionExample.jmx
index 961b6f143f..a86300ea01 100644
--- a/jmeter/src/main/resources/FileExtractionExample.jmx
+++ b/jmeter/src/main/resources/FileExtractionExample.jmx
@@ -57,7 +57,7 @@
false
- FileWriter fWriter = new FileWriter("/result.txt", true);
+ FileWriter fWriter = new FileWriter("<path>/result.txt", true);
BufferedWriter buff = new BufferedWriter(fWriter);
buff.write("Response Code : " + ctx.getPreviousResult().getResponseCode());
diff --git a/persistence-modules/pom.xml b/persistence-modules/pom.xml
index 9606da4594..d7ff51b487 100644
--- a/persistence-modules/pom.xml
+++ b/persistence-modules/pom.xml
@@ -98,7 +98,8 @@
spring-data-mongodb-reactive
spring-data-neo4j
spring-data-redis
- spring-data-rest
+
+
spring-data-rest-2
spring-data-rest-querydsl
spring-data-solr
diff --git a/persistence-modules/spring-data-rest/pom.xml b/persistence-modules/spring-data-rest/pom.xml
index f5601cb7ce..fa2cd033f5 100644
--- a/persistence-modules/spring-data-rest/pom.xml
+++ b/persistence-modules/spring-data-rest/pom.xml
@@ -11,9 +11,9 @@
com.baeldung
- parent-boot-2
+ parent-boot-3
0.0.1-SNAPSHOT
- ../../parent-boot-2
+ ../../parent-boot-3
@@ -42,6 +42,17 @@
spring-boot-starter-test
test
+
+ org.hibernate.orm
+ hibernate-community-dialects
+ ${hibernate-community-dialects.version}
+
+
+ io.rest-assured
+ rest-assured
+ 3.3.0
+ test
+
com.h2database
h2
@@ -64,23 +75,6 @@
${project.artifactId}
-
- com.mysema.maven
- maven-apt-plugin
- ${maven.version}
-
-
- generate-sources
-
- process
-
-
- target/generated-sources
- com.querydsl.apt.jpa.JPAAnnotationProcessor
-
-
-
-
org.springframework.boot
spring-boot-maven-plugin
@@ -91,6 +85,7 @@
com.baeldung.books.SpringDataRestApplication
1.0
+ 6.1.7.Final
\ No newline at end of file
diff --git a/persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/dialect/SQLiteDialect.java b/persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/dialect/SQLiteDialect.java
deleted file mode 100644
index 6e840eec43..0000000000
--- a/persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/dialect/SQLiteDialect.java
+++ /dev/null
@@ -1,78 +0,0 @@
-package com.baeldung.books.dialect;
-
-import org.hibernate.dialect.Dialect;
-import org.hibernate.dialect.identity.IdentityColumnSupport;
-
-import java.sql.Types;
-
-public class SQLiteDialect extends Dialect {
-
- public SQLiteDialect() {
- registerColumnType(Types.BIT, "integer");
- registerColumnType(Types.TINYINT, "tinyint");
- registerColumnType(Types.SMALLINT, "smallint");
- registerColumnType(Types.INTEGER, "integer");
- registerColumnType(Types.BIGINT, "bigint");
- registerColumnType(Types.FLOAT, "float");
- registerColumnType(Types.REAL, "real");
- registerColumnType(Types.DOUBLE, "double");
- registerColumnType(Types.NUMERIC, "numeric");
- registerColumnType(Types.DECIMAL, "decimal");
- registerColumnType(Types.CHAR, "char");
- registerColumnType(Types.VARCHAR, "varchar");
- registerColumnType(Types.LONGVARCHAR, "longvarchar");
- registerColumnType(Types.DATE, "date");
- registerColumnType(Types.TIME, "time");
- registerColumnType(Types.TIMESTAMP, "timestamp");
- registerColumnType(Types.BINARY, "blob");
- registerColumnType(Types.VARBINARY, "blob");
- registerColumnType(Types.LONGVARBINARY, "blob");
- registerColumnType(Types.BLOB, "blob");
- registerColumnType(Types.CLOB, "clob");
- registerColumnType(Types.BOOLEAN, "integer");
- }
-
- public IdentityColumnSupport getIdentityColumnSupport() {
- return new SQLiteIdentityColumnSupport();
- }
-
- public boolean hasAlterTable() {
- return false;
- }
-
- public boolean dropConstraints() {
- return false;
- }
-
- public String getDropForeignKeyString() {
- return "";
- }
-
- public String getAddForeignKeyConstraintString(String constraintName, String[] foreignKey, String referencedTable, String[] primaryKey, boolean referencesPrimaryKey) {
- return "";
- }
-
- public String getAddPrimaryKeyConstraintString(String constraintName) {
- return "";
- }
-
- public String getForUpdateString() {
- return "";
- }
-
- public String getAddColumnString() {
- return "add column";
- }
-
- public boolean supportsOuterJoinForUpdate() {
- return false;
- }
-
- public boolean supportsIfExistsBeforeTableName() {
- return true;
- }
-
- public boolean supportsCascadeDelete() {
- return false;
- }
-}
diff --git a/persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/dialect/SQLiteIdentityColumnSupport.java b/persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/dialect/SQLiteIdentityColumnSupport.java
deleted file mode 100644
index 682d82c6f1..0000000000
--- a/persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/dialect/SQLiteIdentityColumnSupport.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package com.baeldung.books.dialect;
-
-import org.hibernate.MappingException;
-import org.hibernate.dialect.identity.IdentityColumnSupportImpl;
-
-public class SQLiteIdentityColumnSupport extends IdentityColumnSupportImpl {
-
- @Override
- public boolean supportsIdentityColumns() {
- return true;
- }
-
- @Override
- public String getIdentitySelectString(String table, String column, int type) throws MappingException {
- return "select last_insert_rowid()";
- }
-
- @Override
- public String getIdentityColumnString(int type) throws MappingException {
- return "integer";
- }
-}
diff --git a/persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/models/Address.java b/persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/models/Address.java
index 3c36db0f3c..2627c21615 100644
--- a/persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/models/Address.java
+++ b/persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/models/Address.java
@@ -1,11 +1,11 @@
package com.baeldung.books.models;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.OneToOne;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.OneToOne;
@Entity
public class Address {
diff --git a/persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/models/Author.java b/persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/models/Author.java
index aec2e62ebf..385113d800 100644
--- a/persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/models/Author.java
+++ b/persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/models/Author.java
@@ -2,15 +2,15 @@ package com.baeldung.books.models;
import java.util.List;
-import javax.persistence.CascadeType;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.JoinTable;
-import javax.persistence.ManyToMany;
+import jakarta.persistence.CascadeType;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.JoinTable;
+import jakarta.persistence.ManyToMany;
@Entity
public class Author {
diff --git a/persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/models/Book.java b/persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/models/Book.java
index 7451b04b3b..ea3fb325c1 100644
--- a/persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/models/Book.java
+++ b/persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/models/Book.java
@@ -2,15 +2,15 @@ package com.baeldung.books.models;
import java.util.List;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToMany;
-import javax.persistence.ManyToOne;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.FetchType;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.ManyToMany;
+import jakarta.persistence.ManyToOne;
@Entity
public class Book {
diff --git a/persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/models/Library.java b/persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/models/Library.java
index 5f95169a9b..28a54dbd33 100644
--- a/persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/models/Library.java
+++ b/persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/models/Library.java
@@ -2,14 +2,14 @@ package com.baeldung.books.models;
import java.util.List;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.OneToMany;
-import javax.persistence.OneToOne;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.OneToMany;
+import jakarta.persistence.OneToOne;
import org.springframework.data.rest.core.annotation.RestResource;
diff --git a/persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/models/Subject.java b/persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/models/Subject.java
index 11a4425fdd..28d16f5054 100644
--- a/persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/models/Subject.java
+++ b/persistence-modules/spring-data-rest/src/main/java/com/baeldung/books/models/Subject.java
@@ -1,10 +1,10 @@
package com.baeldung.books.models;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
@Entity
public class Subject {
diff --git a/persistence-modules/spring-data-rest/src/main/resources/persistence-sqlite.properties b/persistence-modules/spring-data-rest/src/main/resources/persistence-sqlite.properties
index b6b5f4e4d6..e570322a82 100644
--- a/persistence-modules/spring-data-rest/src/main/resources/persistence-sqlite.properties
+++ b/persistence-modules/spring-data-rest/src/main/resources/persistence-sqlite.properties
@@ -2,6 +2,6 @@ driverClassName=org.sqlite.JDBC
url=jdbc:sqlite:memory:myDb?cache=shared
username=sa
password=sa
-hibernate.dialect=com.baeldung.dialect.SQLiteDialect
+spring.jpa.database-platform=org.hibernate.community.dialect.SQLiteDialect
hibernate.hbm2ddl.auto=create-drop
hibernate.show_sql=true
diff --git a/pom.xml b/pom.xml
index 6ef6abd805..0f024d2d3e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -352,6 +352,7 @@
java-jdi
java-websocket
+ jetbrains
jhipster-5
jmh
@@ -730,7 +731,7 @@
spring-boot-modules/spring-boot-react
spring-ejb-modules/ejb-beans
vaadin
- vavr-modules
+ vavr-modules
@@ -904,6 +905,7 @@
spring-swagger-codegen/custom-validations-opeanpi-codegen
testing-modules/testing-assertions
persistence-modules/fauna
+ persistence-modules/spring-data-rest
rule-engines-modules
@@ -933,7 +935,6 @@
asm
atomikos
atomix
-
bazel
code-generation
@@ -1162,6 +1163,7 @@
spring-swagger-codegen/custom-validations-opeanpi-codegen
testing-modules/testing-assertions
persistence-modules/fauna
+ persistence-modules/spring-data-rest
rule-engines-modules
diff --git a/spring-batch/pom.xml b/spring-batch/pom.xml
index 32126fec9b..e9d3afa376 100644
--- a/spring-batch/pom.xml
+++ b/spring-batch/pom.xml
@@ -28,13 +28,13 @@
javax.xml.bind
jaxb-api
${jaxb.version}
- runtime
+
org.glassfish.jaxb
jaxb-runtime
${jaxb.version}
- runtime
+
diff --git a/spring-boot-modules/spring-boot-3/pom.xml b/spring-boot-modules/spring-boot-3/pom.xml
index cc8e7e1426..685df233ba 100644
--- a/spring-boot-modules/spring-boot-3/pom.xml
+++ b/spring-boot-modules/spring-boot-3/pom.xml
@@ -124,6 +124,8 @@
1.5.2.Final
2.0.0
3.0.0-M7
+ com.baeldung.sample.TodoApplication
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/recordswithjpa/QueryService.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/recordswithjpa/QueryService.java
new file mode 100644
index 0000000000..4c1e73e530
--- /dev/null
+++ b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/recordswithjpa/QueryService.java
@@ -0,0 +1,42 @@
+package com.baeldung.recordswithjpa;
+
+import com.baeldung.recordswithjpa.entity.Book;
+import com.baeldung.recordswithjpa.records.BookRecord;
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.PersistenceContext;
+import jakarta.persistence.Query;
+import jakarta.persistence.TypedQuery;
+import jakarta.persistence.criteria.CriteriaBuilder;
+import jakarta.persistence.criteria.CriteriaQuery;
+import jakarta.persistence.criteria.Root;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class QueryService {
+ @PersistenceContext
+ private EntityManager entityManager;
+
+ public List findAllBooks() {
+ CriteriaBuilder cb = entityManager.getCriteriaBuilder();
+ CriteriaQuery query = cb.createQuery(BookRecord.class);
+ Root root = query.from(Book.class);
+ query.select(cb
+ .construct(BookRecord.class, root.get("id"), root.get("title"), root.get("author"), root.get("isbn")));
+ return entityManager.createQuery(query).getResultList();
+ }
+
+ public BookRecord findBookById(Long id) {
+ TypedQuery query = entityManager
+ .createQuery("SELECT new com.baeldung.recordswithjpa.records.BookRecord(b.id, b.title, b.author, b.isbn) " +
+ "FROM Book b WHERE b.id = :id", BookRecord.class);
+ query.setParameter("id", id);
+ return query.getSingleResult();
+ }
+
+ public List findAllBooksUsingMapping() {
+ Query query = entityManager.createNativeQuery("SELECT * FROM book", "BookRecordMapping");
+ return query.getResultList();
+ }
+}
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/recordswithjpa/RecordsAsJpaApplication.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/recordswithjpa/RecordsAsJpaApplication.java
new file mode 100644
index 0000000000..d6eb1edec1
--- /dev/null
+++ b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/recordswithjpa/RecordsAsJpaApplication.java
@@ -0,0 +1,13 @@
+package com.baeldung.recordswithjpa;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class RecordsAsJpaApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(RecordsAsJpaApplication.class, args);
+ }
+
+}
diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/recordswithjpa/entity/Book.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/recordswithjpa/entity/Book.java
new file mode 100644
index 0000000000..9ea982e323
--- /dev/null
+++ b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/recordswithjpa/entity/Book.java
@@ -0,0 +1,70 @@
+package com.baeldung.recordswithjpa.entity;
+
+import com.baeldung.recordswithjpa.records.BookRecord;
+import jakarta.persistence.*;
+
+@SqlResultSetMapping(
+ name = "BookRecordMapping",
+ classes = @ConstructorResult(
+ targetClass = BookRecord.class,
+ columns = {
+ @ColumnResult(name = "id", type = Long.class),
+ @ColumnResult(name = "title", type = String.class),
+ @ColumnResult(name = "author", type = String.class),
+ @ColumnResult(name = "isbn", type = String.class)
+ }
+ )
+)
+@Entity
+@Table(name = "book")
+public class Book {
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Long id;
+ private String title;
+ private String author;
+ private String isbn;
+
+ public Book() {
+ }
+
+ public Book(Long id, String title, String author, String isbn) {
+ this.id = id;
+ this.title = title;
+ this.author = author;
+ this.isbn = isbn;
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ public String getAuthor() {
+ return author;
+ }
+
+ public void setAuthor(String author) {
+ this.author = author;
+ }
+
+ public String getIsbn() {
+ return isbn;
+ }
+
+ public void setIsbn(String isbn) {
+ this.isbn = isbn;
+ }
+
+}
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/recordswithjpa/records/BookRecord.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/recordswithjpa/records/BookRecord.java
new file mode 100644
index 0000000000..96968575d9
--- /dev/null
+++ b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/recordswithjpa/records/BookRecord.java
@@ -0,0 +1,4 @@
+package com.baeldung.recordswithjpa.records;
+
+public record BookRecord(Long id, String title, String author, String isbn) {
+}
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/recordswithjpa/records/CustomBookRecord.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/recordswithjpa/records/CustomBookRecord.java
new file mode 100644
index 0000000000..35e9be9513
--- /dev/null
+++ b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/recordswithjpa/records/CustomBookRecord.java
@@ -0,0 +1,4 @@
+package com.baeldung.recordswithjpa.records;
+
+public record CustomBookRecord(Long id, String title) {
+}
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/recordswithjpa/repository/BookRepository.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/recordswithjpa/repository/BookRepository.java
new file mode 100644
index 0000000000..4ef5f17296
--- /dev/null
+++ b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/recordswithjpa/repository/BookRepository.java
@@ -0,0 +1,17 @@
+package com.baeldung.recordswithjpa.repository;
+
+import com.baeldung.recordswithjpa.entity.Book;
+import com.baeldung.recordswithjpa.records.BookRecord;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.CrudRepository;
+import org.springframework.data.repository.query.Param;
+
+import java.util.List;
+
+public interface BookRepository extends CrudRepository {
+ List findBookByAuthor(String author);
+
+ @Query("SELECT new com.baeldung.recordswithjpa.records.BookRecord(b.id, b.title, b.author, b.isbn) " +
+ "FROM Book b WHERE b.id = :id")
+ BookRecord findBookById(@Param("id") Long id);
+}
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/recordswithjpa/repository/CustomBookRepository.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/recordswithjpa/repository/CustomBookRepository.java
new file mode 100644
index 0000000000..bb8002d70d
--- /dev/null
+++ b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/recordswithjpa/repository/CustomBookRepository.java
@@ -0,0 +1,9 @@
+package com.baeldung.recordswithjpa.repository;
+
+import com.baeldung.recordswithjpa.records.CustomBookRecord;
+
+import java.util.List;
+
+public interface CustomBookRepository {
+ List findAllBooks();
+}
diff --git a/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/recordswithjpa/repository/CustomBookRepositoryImpl.java b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/recordswithjpa/repository/CustomBookRepositoryImpl.java
new file mode 100644
index 0000000000..8d420a9874
--- /dev/null
+++ b/spring-boot-modules/spring-boot-3/src/main/java/com/baeldung/recordswithjpa/repository/CustomBookRepositoryImpl.java
@@ -0,0 +1,20 @@
+package com.baeldung.recordswithjpa.repository;
+
+import com.baeldung.recordswithjpa.records.CustomBookRecord;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public class CustomBookRepositoryImpl implements CustomBookRepository {
+ private final JdbcTemplate jdbcTemplate;
+
+ public CustomBookRepositoryImpl(JdbcTemplate jdbcTemplate) {
+ this.jdbcTemplate = jdbcTemplate;
+ }
+
+ public List findAllBooks() {
+ return jdbcTemplate.query("SELECT id, title FROM book", (rs, rowNum) -> new CustomBookRecord(rs.getLong("id"), rs.getString("title")));
+ }
+}
diff --git a/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/recordswithjpa/QueryServiceIntegrationTest.java b/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/recordswithjpa/QueryServiceIntegrationTest.java
new file mode 100644
index 0000000000..011895e7fa
--- /dev/null
+++ b/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/recordswithjpa/QueryServiceIntegrationTest.java
@@ -0,0 +1,39 @@
+package com.baeldung.recordswithjpa;
+
+import com.baeldung.recordswithjpa.entity.Book;
+import com.baeldung.recordswithjpa.records.BookRecord;
+import com.baeldung.recordswithjpa.repository.BookRepository;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+
+import java.util.List;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+public class QueryServiceIntegrationTest extends RecordsAsJpaIntegrationTest {
+
+ @Autowired
+ private QueryService queryService;
+
+
+ @Test
+ void findAllBooks() {
+ List allBooks = queryService.findAllBooks();
+ assertEquals(3, allBooks.size());
+ }
+
+ @Test
+ void findBookById() {
+ BookRecord bookById = queryService.findBookById(1L);
+ assertEquals("The Lord of the Rings", bookById.title());
+ }
+
+ @Test
+ void findAllBooksUsingMapping() {
+ List allBooksUsingMapping = queryService.findAllBooksUsingMapping();
+ assertEquals(3, allBooksUsingMapping.size());
+ }
+}
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/recordswithjpa/RecordsAsJpaIntegrationTest.java b/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/recordswithjpa/RecordsAsJpaIntegrationTest.java
new file mode 100644
index 0000000000..f0869dad48
--- /dev/null
+++ b/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/recordswithjpa/RecordsAsJpaIntegrationTest.java
@@ -0,0 +1,30 @@
+package com.baeldung.recordswithjpa;
+
+import com.baeldung.recordswithjpa.entity.Book;
+import com.baeldung.recordswithjpa.repository.BookRepository;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+public class RecordsAsJpaIntegrationTest {
+ @Autowired
+ protected BookRepository bookRepository;
+
+ @BeforeEach
+ void setUp() {
+ Book book = new Book(1L,"The Lord of the Rings", "J.R.R. Tolkien", "978-0544003415");
+ Book book2 = new Book(2L,"The Hobbit", "J.R.R. Tolkien", "978-0547928227");
+ Book book3 = new Book(3L,"Harry Potter and the Philosopher's Stone", "J.K. Rowling", "978-0747532699");
+
+ bookRepository.save(book);
+ bookRepository.save(book2);
+ bookRepository.save(book3);
+ }
+
+ @AfterEach
+ void tearDown() {
+ bookRepository.deleteAll();
+ }
+}
diff --git a/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/recordswithjpa/repository/BookRepositoryIntegrationTest.java b/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/recordswithjpa/repository/BookRepositoryIntegrationTest.java
new file mode 100644
index 0000000000..9173fea269
--- /dev/null
+++ b/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/recordswithjpa/repository/BookRepositoryIntegrationTest.java
@@ -0,0 +1,19 @@
+package com.baeldung.recordswithjpa.repository;
+
+import com.baeldung.recordswithjpa.RecordsAsJpaIntegrationTest;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+class BookRepositoryIntegrationTest extends RecordsAsJpaIntegrationTest {
+
+ @Test
+ void findBookByAuthor() {
+ assertEquals(2, bookRepository.findBookByAuthor("J.R.R. Tolkien").size());
+ }
+
+ @Test
+ void findBookById() {
+ assertEquals("The Lord of the Rings", bookRepository.findBookById(1L).title());
+ }
+}
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/recordswithjpa/repository/CustomBookRepositoryIntegrationTest.java b/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/recordswithjpa/repository/CustomBookRepositoryIntegrationTest.java
new file mode 100644
index 0000000000..866645429a
--- /dev/null
+++ b/spring-boot-modules/spring-boot-3/src/test/java/com/baeldung/recordswithjpa/repository/CustomBookRepositoryIntegrationTest.java
@@ -0,0 +1,23 @@
+package com.baeldung.recordswithjpa.repository;
+
+import com.baeldung.recordswithjpa.RecordsAsJpaIntegrationTest;
+import com.baeldung.recordswithjpa.records.CustomBookRecord;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+
+import java.util.List;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+class CustomBookRepositoryIntegrationTest extends RecordsAsJpaIntegrationTest {
+
+ @Autowired
+ private CustomBookRepository customBookRepository;
+
+ @Test
+ void findAllBooks() {
+ List allBooks = customBookRepository.findAllBooks();
+ assertEquals(3, allBooks.size());
+ }
+}
\ No newline at end of file
diff --git a/spring-reactive-modules/spring-5-data-reactive/pom.xml b/spring-reactive-modules/spring-5-data-reactive/pom.xml
index bf5170c621..0ed997b3f4 100644
--- a/spring-reactive-modules/spring-5-data-reactive/pom.xml
+++ b/spring-reactive-modules/spring-5-data-reactive/pom.xml
@@ -42,6 +42,7 @@
org.projectlombok
lombok
+ 1.18.22
io.projectreactor