@@ -84,8 +84,21 @@ public MappingR2dbcConverter(
84
84
// Entity reading
85
85
// ----------------------------------
86
86
87
+ /*
88
+ * (non-Javadoc)
89
+ * @see org.springframework.data.convert.EntityReader#read(java.lang.Class, S)
90
+ */
87
91
@ Override
88
92
public <R > R read (Class <R > type , Row row ) {
93
+ return read (type , row , null );
94
+ }
95
+
96
+ /*
97
+ * (non-Javadoc)
98
+ * @see org.springframework.data.r2dbc.convert.R2dbcConverter#read(java.lang.Class, io.r2dbc.spi.Row, io.r2dbc.spi.RowMetadata)
99
+ */
100
+ @ Override
101
+ public <R > R read (Class <R > type , Row row , @ Nullable RowMetadata metadata ) {
89
102
90
103
TypeInformation <? extends R > typeInfo = ClassTypeInformation .from (type );
91
104
Class <? extends R > rawType = typeInfo .getType ();
@@ -99,10 +112,10 @@ public <R> R read(Class<R> type, Row row) {
99
112
return getConversionService ().convert (row , rawType );
100
113
}
101
114
102
- return read (getRequiredPersistentEntity (type ), row );
115
+ return read (getRequiredPersistentEntity (type ), row , metadata );
103
116
}
104
117
105
- private <R > R read (RelationalPersistentEntity <R > entity , Row row ) {
118
+ private <R > R read (RelationalPersistentEntity <R > entity , Row row , @ Nullable RowMetadata metadata ) {
106
119
107
120
R result = createInstance (row , "" , entity );
108
121
@@ -115,7 +128,7 @@ private <R> R read(RelationalPersistentEntity<R> entity, Row row) {
115
128
continue ;
116
129
}
117
130
118
- Object value = readFrom (row , property , "" );
131
+ Object value = readFrom (row , metadata , property , "" );
119
132
120
133
if (value != null ) {
121
134
propertyAccessor .setProperty (property , value );
@@ -129,20 +142,27 @@ private <R> R read(RelationalPersistentEntity<R> entity, Row row) {
129
142
* Read a single value or a complete Entity from the {@link Row} passed as an argument.
130
143
*
131
144
* @param row the {@link Row} to extract the value from. Must not be {@literal null}.
145
+ * @param metadata the {@link RowMetadata}. Can be {@literal null}.
132
146
* @param property the {@link RelationalPersistentProperty} for which the value is intended. Must not be
133
147
* {@literal null}.
134
148
* @param prefix to be used for all column names accessed by this method. Must not be {@literal null}.
135
149
* @return the value read from the {@link Row}. May be {@literal null}.
136
150
*/
137
- private Object readFrom (Row row , RelationalPersistentProperty property , String prefix ) {
151
+ private Object readFrom (Row row , @ Nullable RowMetadata metadata , RelationalPersistentProperty property ,
152
+ String prefix ) {
138
153
139
154
try {
140
155
141
156
if (property .isEntity ()) {
142
- return readEntityFrom (row , property );
157
+ return readEntityFrom (row , metadata , property );
143
158
}
144
159
145
- Object value = row .get (prefix + property .getColumnName ());
160
+ String identifier = prefix + property .getColumnName ();
161
+ if (metadata != null && !metadata .getColumnNames ().contains (identifier )) {
162
+ return null ;
163
+ }
164
+
165
+ Object value = row .get (identifier );
146
166
return getPotentiallyConvertedSimpleRead (value , property .getTypeInformation ().getType ());
147
167
148
168
} catch (Exception o_O ) {
@@ -178,13 +198,13 @@ private Object getPotentiallyConvertedSimpleRead(@Nullable Object value, @Nullab
178
198
}
179
199
180
200
@ SuppressWarnings ("unchecked" )
181
- private <S > S readEntityFrom (Row row , PersistentProperty <?> property ) {
201
+ private <S > S readEntityFrom (Row row , RowMetadata metadata , PersistentProperty <?> property ) {
182
202
183
203
String prefix = property .getName () + "_" ;
184
204
185
205
RelationalPersistentEntity <?> entity = getMappingContext ().getRequiredPersistentEntity (property .getActualType ());
186
206
187
- if (readFrom (row , entity .getRequiredIdProperty (), prefix ) == null ) {
207
+ if (readFrom (row , metadata , entity .getRequiredIdProperty (), prefix ) == null ) {
188
208
return null ;
189
209
}
190
210
@@ -195,7 +215,7 @@ private <S> S readEntityFrom(Row row, PersistentProperty<?> property) {
195
215
196
216
for (RelationalPersistentProperty p : entity ) {
197
217
if (!entity .isConstructorArgument (property )) {
198
- propertyAccessor .setProperty (p , readFrom (row , p , prefix ));
218
+ propertyAccessor .setProperty (p , readFrom (row , metadata , p , prefix ));
199
219
}
200
220
}
201
221
@@ -213,6 +233,10 @@ private <S> S createInstance(Row row, String prefix, RelationalPersistentEntity<
213
233
// Entity writing
214
234
// ----------------------------------
215
235
236
+ /*
237
+ * (non-Javadoc)
238
+ * @see org.springframework.data.convert.EntityWriter#write(java.lang.Object, java.lang.Object)
239
+ */
216
240
@ Override
217
241
public void write (Object source , OutboundRow sink ) {
218
242
@@ -313,6 +337,11 @@ private Object getPotentiallyConvertedSimpleWrite(@Nullable Object value) {
313
337
return Enum .class .isAssignableFrom (value .getClass ()) ? ((Enum <?>) value ).name () : value ;
314
338
}
315
339
340
+ /*
341
+ * (non-Javadoc)
342
+ * @see org.springframework.data.r2dbc.convert.R2dbcConverter#getArrayValue(org.springframework.data.r2dbc.dialect.ArrayColumns, org.springframework.data.relational.core.mapping.RelationalPersistentProperty, java.lang.Object)
343
+ */
344
+ @ Override
316
345
public Object getArrayValue (ArrayColumns arrayColumns , RelationalPersistentProperty property , Object value ) {
317
346
318
347
Class <?> targetType = arrayColumns .getArrayType (property .getActualType ());
@@ -337,6 +366,7 @@ public Object getArrayValue(ArrayColumns arrayColumns, RelationalPersistentPrope
337
366
* @param object must not be {@literal null}.
338
367
* @return
339
368
*/
369
+ @ Override
340
370
@ SuppressWarnings ("unchecked" )
341
371
public <T > BiFunction <Row , RowMetadata , T > populateIdIfNecessary (T object ) {
342
372
0 commit comments