Skip to content

Commit 5cbda1f

Browse files
author
Maciej Rosiek
committed
Implemented DatabaseField annotation parameter that allows to specify more java side field than in postgres type
1 parent 6fdffee commit 5cbda1f

File tree

3 files changed

+23
-10
lines changed

3 files changed

+23
-10
lines changed

src/main/java/de/zalando/typemapper/annotations/DatabaseField.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,4 +35,5 @@
3535

3636
Class<? extends ObjectMapper<?>> mapper() default DefaultObjectMapper.class;
3737

38+
boolean optional() default false;
3839
}

src/main/java/de/zalando/typemapper/core/DatabaseFieldDescriptor.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,18 +11,21 @@ public class DatabaseFieldDescriptor {
1111
private int position;
1212
private Class<? extends ValueTransformer<?, ?>> transformer;
1313
private Class<? extends ObjectMapper<?>> mapper;
14+
private boolean optional;
1415

1516
public DatabaseFieldDescriptor(final DatabaseField databaseField) {
1617
this.name = databaseField.name();
1718
this.position = databaseField.position();
1819
this.transformer = databaseField.transformer();
1920
this.mapper = databaseField.mapper();
21+
this.optional = databaseField.optional();
2022
}
2123

2224
public DatabaseFieldDescriptor(final Column column) {
2325
this.name = column.name();
2426
this.position = -1;
2527
this.transformer = AnyTransformer.class;
28+
this.optional = false;
2629
}
2730

2831
public String getName() {
@@ -40,4 +43,9 @@ public int getPosition() {
4043
public Class<? extends ObjectMapper<?>> getMapper() {
4144
return mapper;
4245
}
46+
47+
public boolean isOptional() {
48+
return optional;
49+
}
50+
4351
}

src/main/java/de/zalando/typemapper/postgres/PgTypeHelper.java

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -305,29 +305,33 @@ public int compare(final Field a, final Field b) {
305305
DbTypeField dbField = null;
306306
if (dbFields != null) {
307307

308+
if (resultPositionMap == null) {
309+
resultPositionMap = new TreeMap<Integer, Object>();
310+
}
311+
308312
// we have type information from database (field positions)
309313
final String dbFieldName = Mapping.getDatabaseFieldName(f, databaseFieldDescriptor.getName());
310314
dbField = dbFields.get(dbFieldName);
311315

312316
if (dbField == null) {
313-
throw new IllegalArgumentException("Field " + f.getName() + " (" + dbFieldName
314-
+ ") of class " + clazz.getSimpleName() + " could not be found in database type "
315-
+ typeName);
316-
}
317-
318-
if (resultPositionMap == null) {
319-
resultPositionMap = new TreeMap<Integer, Object>();
317+
if (!databaseFieldDescriptor.isOptional()) {
318+
throw new IllegalArgumentException("Field " + f.getName() + " (" + dbFieldName
319+
+ ") of class " + clazz.getSimpleName()
320+
+ " could not be found in database type " + typeName);
321+
}
322+
} else {
323+
resultPositionMap.put(dbField.getPosition(), value);
320324
}
321-
322-
resultPositionMap.put(dbField.getPosition(), value);
323325
}
324326

325327
if (dbField == null) {
326328
if (resultList == null) {
327329
resultList = new ArrayList<Object>();
328330
}
329331

330-
resultList.add(value);
332+
if (!databaseFieldDescriptor.isOptional()) {
333+
resultList.add(value);
334+
}
331335
}
332336
}
333337
}

0 commit comments

Comments
 (0)