diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/core/BeanPropertyRowMapper.java b/spring-jdbc/src/main/java/org/springframework/jdbc/core/BeanPropertyRowMapper.java index dc2ea096831..cd51ba286ba 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/core/BeanPropertyRowMapper.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/core/BeanPropertyRowMapper.java @@ -73,6 +73,10 @@ import org.springframework.util.StringUtils; * {@code true}. See {@link #setPrimitivesDefaultedForNullValue(boolean)} for * details. * + *
If you need to map to a target class which has a data class constructor + * — for example, a Java {@code record} or a Kotlin {@code data} class — + * use {@link DataClassRowMapper} instead. + * *
Please note that this class is designed to provide convenience rather than * high performance. For best performance, consider using a custom {@code RowMapper} * implementation. diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/core/DataClassRowMapper.java b/spring-jdbc/src/main/java/org/springframework/jdbc/core/DataClassRowMapper.java index 7b1b62cb434..eba4e83aca1 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/core/DataClassRowMapper.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/core/DataClassRowMapper.java @@ -32,15 +32,29 @@ import org.springframework.util.Assert; * {@link RowMapper} implementation that converts a row into a new instance * of the specified mapped target class. The mapped target class must be a * top-level class or {@code static} nested class, and it may expose either a - * data class constructor with named parameters corresponding to column names - * or classic bean property setter methods with property names corresponding to - * column names (or even a combination of both). + * data class constructor with named parameters corresponding to column + * names or classic bean property setter methods with property names corresponding + * to column names (or even a combination of both). + * + *
The term "data class" applies to Java records, Kotlin data + * classes, and any class which has a constructor with named parameters + * that are intended to be mapped to corresponding column names. + * + *
When combining a data class constructor with setter methods, any property + * mapped successfully via a constructor argument will not be mapped additionally + * via a corresponding setter method. This means that constructor arguments take + * precedence over property setter methods. * *
Note that this class extends {@link BeanPropertyRowMapper} and can * therefore serve as a common choice for any mapped target class, flexibly * adapting to constructor style versus setter methods in the mapped class. * + *
Please note that this class is designed to provide convenience rather than
+ * high performance. For best performance, consider using a custom {@code RowMapper}
+ * implementation.
+ *
* @author Juergen Hoeller
+ * @author Sam Brannen
* @since 5.3
* @param