From 31f42109e3a3758a59ffee7826b88eb5043a5bd6 Mon Sep 17 00:00:00 2001 From: Collin Alpert Date: Tue, 9 Oct 2018 20:36:29 +0200 Subject: [PATCH] Added handling for null values in foreign keys --- README.md | 2 +- pom.xml | 19 +++++-- .../java2db/mappers/BaseMapper.java | 26 ++++++++- .../collinalpert/java2db/queries/Query.java | 2 +- .../java2db/services/BaseService.java | 56 +++++++++++++++++++ 5 files changed, 98 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 2db31f0..9ad5c1d 100644 --- a/README.md +++ b/README.md @@ -122,7 +122,7 @@ First, include the Maven artifact: com.github.collinalpert java2db - 2.2.4 + 2.2.5 ``` Or include the [JAR](https://github.com/CollinAlpert/Java2DB/releases/latest) in your project. To begin using this library, you need to do two things on program start: diff --git a/pom.xml b/pom.xml index 30aaf58..dbe735a 100755 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ com.github.collinalpert java2db - 2.2.4 + 2.2.5 jar Java2DB @@ -50,9 +50,10 @@ - 10 - 10 - 10 + 10 + ${java-version} + ${java-version} + ${java-version} UTF-8 @@ -84,6 +85,16 @@ + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.0 + + ${java-version} + ${java-version} + + + org.sonatype.plugins nexus-staging-maven-plugin diff --git a/src/main/java/com/github/collinalpert/java2db/mappers/BaseMapper.java b/src/main/java/com/github/collinalpert/java2db/mappers/BaseMapper.java index abf123e..a20e949 100755 --- a/src/main/java/com/github/collinalpert/java2db/mappers/BaseMapper.java +++ b/src/main/java/com/github/collinalpert/java2db/mappers/BaseMapper.java @@ -10,6 +10,7 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; +import java.util.LinkedList; import java.util.List; import java.util.Optional; @@ -88,6 +89,7 @@ private void setFields(ResultSet set, E entity) throws SQ private void setFields(ResultSet set, E entity, String identifier) throws SQLException { var fields = Utilities.getEntityFields(entity.getClass(), true); var tableName = Utilities.getTableName(entity.getClass()); + var foreignKeyFields = new LinkedList(); for (Field field : fields) { field.setAccessible(true); try { @@ -95,16 +97,38 @@ private void setFields(ResultSet set, E entity, String id if (!BaseEntity.class.isAssignableFrom(field.getType())) { throw new IllegalArgumentException(String.format("Type %s which is annotated as a foreign key, does not extend BaseEntity", field.getType().getSimpleName())); } + foreignKeyFields.add(field); var foreignKeyObject = IoC.resolve((Class) field.getType()); setFields(set, foreignKeyObject, UniqueIdentifier.getIdentifier(field.getName())); field.set(entity, foreignKeyObject); continue; } - var value = set.getObject((identifier == null ? tableName : identifier) + "_" + field.getName(), field.getType()); + var value = set.getObject((identifier == null ? tableName : identifier) + "_" + field.getName()); + if (value == null) { + continue; + } field.set(entity, value); } catch (IllegalAccessException e) { e.printStackTrace(); } } + validateEntityForNull(entity, foreignKeyFields); + } + + private void validateEntityForNull(E entity, List foreignKeyFields) { + foreignKeyFields.forEach(field -> { + var foreignKeyText = field.getAnnotation(ForeignKeyObject.class).value(); + try { + field.setAccessible(true); + var foreignKeyField = entity.getClass().getDeclaredField(foreignKeyText); + foreignKeyField.setAccessible(true); + var value = foreignKeyField.get(entity); + if (value == null) { + field.set(entity, null); + } + } catch (NoSuchFieldException | IllegalAccessException e) { + e.printStackTrace(); + } + }); } } diff --git a/src/main/java/com/github/collinalpert/java2db/queries/Query.java b/src/main/java/com/github/collinalpert/java2db/queries/Query.java index be56e74..5af95cf 100644 --- a/src/main/java/com/github/collinalpert/java2db/queries/Query.java +++ b/src/main/java/com/github/collinalpert/java2db/queries/Query.java @@ -147,7 +147,7 @@ private String buildQuery() { } builder.append(String.join(", ", fieldList)).append(" from ").append(tableName); for (var foreignKey : foreignKeyList) { - builder.append(" inner join `").append(foreignKey.getChildTable()).append("` ").append(foreignKey.getAlias()).append(" on `").append(foreignKey.getParentClass()).append("`.").append(foreignKey.getParentForeignKey()).append(" = ").append(foreignKey.getAlias()).append(".id"); + builder.append(" left join `").append(foreignKey.getChildTable()).append("` ").append(foreignKey.getAlias()).append(" on `").append(foreignKey.getParentClass()).append("`.").append(foreignKey.getParentForeignKey()).append(" = ").append(foreignKey.getAlias()).append(".id"); } var constraints = QueryConstraints.getConstraints(this.type); if (this.whereClause == null) { diff --git a/src/main/java/com/github/collinalpert/java2db/services/BaseService.java b/src/main/java/com/github/collinalpert/java2db/services/BaseService.java index dbd169a..953d4ad 100755 --- a/src/main/java/com/github/collinalpert/java2db/services/BaseService.java +++ b/src/main/java/com/github/collinalpert/java2db/services/BaseService.java @@ -3,9 +3,11 @@ import com.github.collinalpert.java2db.database.DBConnection; import com.github.collinalpert.java2db.entities.BaseEntity; import com.github.collinalpert.java2db.mappers.BaseMapper; +import com.github.collinalpert.java2db.queries.OrderTypes; import com.github.collinalpert.java2db.queries.Query; import com.github.collinalpert.java2db.utilities.IoC; import com.github.collinalpert.java2db.utilities.Utilities; +import com.github.collinalpert.lambda2sql.functions.SqlFunction; import com.github.collinalpert.lambda2sql.functions.SqlPredicate; import java.lang.reflect.ParameterizedType; @@ -152,6 +154,60 @@ public Optional getById(long id) { public List getAll() { return getMultiple(x -> true).get(); } + + /** + * Gets all values from the table but limits the result. + * + * @param limit The maximum of records to return. + * @return A list with the maximum size of the parameter specified. + */ + public List getAll(int limit) { + return getMultiple(x -> true).limit(limit).get(); + } + + /** + * Gets all values from the table and orders them in an ascending order. + * + * @param orderBy The property to order by. + * @return A list of all records ordered by a specific property in an ascending order. + */ + public List getAll(SqlFunction orderBy) { + return getAll(orderBy, OrderTypes.ASCENDING); + } + + /** + * Gets all values from the table and orders them in the specified order. + * + * @param orderBy The property to order by. + * @param sortingType The order direction. Can be either ascending or descending. + * @return A list of all records ordered by a specific property in the specified order. + */ + public List getAll(SqlFunction orderBy, OrderTypes sortingType) { + return getMultiple(x -> true).orderBy(orderBy, sortingType).get(); + } + + /** + * Gets all values from the table, orders them in an ascending order and limits the result. + * + * @param orderBy The property to order by. + * @param limit The maximum records to return. + * @return A list with the maximum size of the parameter specified and in an ascending order. + */ + public List getAll(SqlFunction orderBy, int limit) { + return getAll(orderBy, OrderTypes.ASCENDING, limit); + } + + /** + * Gets all values from the table, orders them in a specific order and limits the result. + * + * @param orderBy The property to order by. + * @param sortingType The order direction. Can be either ascending or descending. + * @param limit The maximum records to return. + * @return A list with the maximum size of the parameter specified and in an ascending order. + */ + public List getAll(SqlFunction orderBy, OrderTypes sortingType, int limit) { + return getMultiple(x -> true).orderBy(orderBy, sortingType).limit(limit).get(); + } //endregion //region Update