23
23
import java .sql .ResultSet ;
24
24
import java .util .function .BiFunction ;
25
25
26
- import org .springframework .core .convert .ConversionService ;
27
26
import org .springframework .data .mapping .MappingException ;
28
27
import org .springframework .data .mapping .PersistentProperty ;
29
28
import org .springframework .data .mapping .PersistentPropertyAccessor ;
39
38
* Maps a {@link io.r2dbc.spi.Row} to an entity of type {@code T}, including entities referenced.
40
39
*
41
40
* @author Mark Paluch
42
- * @since 1.0
41
+ * @author Ryland Degnan
43
42
*/
44
43
public class EntityRowMapper <T > implements BiFunction <Row , RowMetadata , T > {
45
44
@@ -52,13 +51,17 @@ public EntityRowMapper(RelationalPersistentEntity<T> entity, RelationalConverter
52
51
this .converter = converter ;
53
52
}
54
53
54
+ /*
55
+ * (non-Javadoc)
56
+ * @see java.util.function.BiFunction#apply(java.lang.Object, java.lang.Object)
57
+ */
55
58
@ Override
56
59
public T apply (Row row , RowMetadata metadata ) {
57
60
58
61
T result = createInstance (row , "" , entity );
59
62
60
- ConvertingPropertyAccessor propertyAccessor = new ConvertingPropertyAccessor ( entity . getPropertyAccessor ( result ),
61
- converter .getConversionService ());
63
+ ConvertingPropertyAccessor < T > propertyAccessor = new ConvertingPropertyAccessor <>(
64
+ entity . getPropertyAccessor ( result ), converter .getConversionService ());
62
65
63
66
for (RelationalPersistentProperty property : entity ) {
64
67
@@ -93,7 +96,7 @@ private Object readFrom(Row row, RelationalPersistentProperty property, String p
93
96
return readEntityFrom (row , property );
94
97
}
95
98
96
- return row .get (prefix + property .getColumnName ());
99
+ return converter . readValue ( row .get (prefix + property .getColumnName ()), property . getTypeInformation ());
97
100
98
101
} catch (Exception o_O ) {
99
102
throw new MappingException (String .format ("Could not read property %s from result set!" , property ), o_O );
@@ -104,7 +107,6 @@ private <S> S readEntityFrom(Row row, PersistentProperty<?> property) {
104
107
105
108
String prefix = property .getName () + "_" ;
106
109
107
- @ SuppressWarnings ("unchecked" )
108
110
RelationalPersistentEntity <S > entity = (RelationalPersistentEntity <S >) converter .getMappingContext ()
109
111
.getRequiredPersistentEntity (property .getActualType ());
110
112
@@ -114,8 +116,8 @@ private <S> S readEntityFrom(Row row, PersistentProperty<?> property) {
114
116
115
117
S instance = createInstance (row , prefix , entity );
116
118
117
- PersistentPropertyAccessor accessor = entity .getPropertyAccessor (instance );
118
- ConvertingPropertyAccessor propertyAccessor = new ConvertingPropertyAccessor (accessor ,
119
+ PersistentPropertyAccessor < S > accessor = entity .getPropertyAccessor (instance );
120
+ ConvertingPropertyAccessor < S > propertyAccessor = new ConvertingPropertyAccessor <> (accessor ,
119
121
converter .getConversionService ());
120
122
121
123
for (RelationalPersistentProperty p : entity ) {
@@ -129,8 +131,7 @@ private <S> S readEntityFrom(Row row, PersistentProperty<?> property) {
129
131
130
132
private <S > S createInstance (Row row , String prefix , RelationalPersistentEntity <S > entity ) {
131
133
132
- RowParameterValueProvider rowParameterValueProvider = new RowParameterValueProvider (row , entity ,
133
- converter .getConversionService (), prefix );
134
+ RowParameterValueProvider rowParameterValueProvider = new RowParameterValueProvider (row , entity , converter , prefix );
134
135
135
136
return converter .createInstance (entity , rowParameterValueProvider ::getParameterValue );
136
137
}
@@ -140,7 +141,7 @@ private static class RowParameterValueProvider implements ParameterValueProvider
140
141
141
142
private final @ NonNull Row resultSet ;
142
143
private final @ NonNull RelationalPersistentEntity <?> entity ;
143
- private final @ NonNull ConversionService conversionService ;
144
+ private final @ NonNull RelationalConverter converter ;
144
145
private final @ NonNull String prefix ;
145
146
146
147
/*
@@ -151,10 +152,13 @@ private static class RowParameterValueProvider implements ParameterValueProvider
151
152
@ Nullable
152
153
public <T > T getParameterValue (Parameter <T , RelationalPersistentProperty > parameter ) {
153
154
154
- String column = prefix + entity .getRequiredPersistentProperty (parameter .getName ()).getColumnName ();
155
+ RelationalPersistentProperty property = entity .getRequiredPersistentProperty (parameter .getName ());
156
+ String column = prefix + property .getColumnName ();
155
157
156
158
try {
157
- return conversionService .convert (resultSet .get (column ), parameter .getType ().getType ());
159
+
160
+ Object value = converter .readValue (resultSet .get (column ), property .getTypeInformation ());
161
+ return converter .getConversionService ().convert (value , parameter .getType ().getType ());
158
162
} catch (Exception o_O ) {
159
163
throw new MappingException (String .format ("Couldn't read column %s from Row." , column ), o_O );
160
164
}
0 commit comments