summaryrefslogtreecommitdiff
path: root/container-compiler-plugin/src/main/java/io/trygvis/persistence/EntityMirror.java
diff options
context:
space:
mode:
Diffstat (limited to 'container-compiler-plugin/src/main/java/io/trygvis/persistence/EntityMirror.java')
-rw-r--r--container-compiler-plugin/src/main/java/io/trygvis/persistence/EntityMirror.java104
1 files changed, 83 insertions, 21 deletions
diff --git a/container-compiler-plugin/src/main/java/io/trygvis/persistence/EntityMirror.java b/container-compiler-plugin/src/main/java/io/trygvis/persistence/EntityMirror.java
index 8e1602c..74c4829 100644
--- a/container-compiler-plugin/src/main/java/io/trygvis/persistence/EntityMirror.java
+++ b/container-compiler-plugin/src/main/java/io/trygvis/persistence/EntityMirror.java
@@ -3,18 +3,26 @@ package io.trygvis.persistence;
import io.trygvis.container.compiler.NotImplementedException;
import io.trygvis.container.compiler.SqlUnitModel;
import io.trygvis.container.compiler.model.ClassG;
-import io.trygvis.container.compiler.model.ParameterRef;
+import io.trygvis.container.compiler.model.Parameters;
import io.trygvis.container.compiler.model.TypeRef;
+import io.trygvis.persistence.sql.AbstractTypedQuery;
+import io.trygvis.persistence.sql.SqlEntityDesc;
+import javax.persistence.TypedQuery;
import java.sql.Connection;
import java.sql.PreparedStatement;
+import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
+import static io.trygvis.container.compiler.model.Parameters.ParameterRef;
import static io.trygvis.persistence.FieldMirror.PrimitiveFieldMirror;
import static io.trygvis.persistence.FieldMirror.ReferenceFieldMirror;
import static java.lang.String.format;
+import static java.lang.reflect.Modifier.PUBLIC;
+import static java.lang.reflect.Modifier.STATIC;
+import static java.util.Collections.singletonList;
import static org.apache.commons.lang.StringUtils.join;
public class EntityMirror implements Comparable<EntityMirror> {
@@ -30,7 +38,7 @@ public class EntityMirror implements Comparable<EntityMirror> {
this.type = type;
this.tableName = tableName;
- this.daoType = new TypeRef(type.name + "Dao");
+ this.daoType = new TypeRef(type.plainName + "Dao").args(type.args);
}
public void add(FieldMirror field) {
@@ -111,41 +119,51 @@ public class EntityMirror implements Comparable<EntityMirror> {
return "DELETE FROM " + tableName + " WHERE " + join(ss, " AND ") + ";";
}
+ public String defaultFields() {
+ List<String> names = new ArrayList<>();
+ for (FieldMirror field : fields) {
+ names.add(field.sqlName);
+ }
+
+ return join(names, ", ");
+ }
+
public void insertInto(SqlUnitModel unit, ClassG g) {
TypeRef conType = g.addImport(Connection.class);
TypeRef psType = g.addImport(PreparedStatement.class);
- TypeRef objectType = g.addImport(type);
- ParameterRef con = new ParameterRef(conType, "con");
- ParameterRef object = new ParameterRef(objectType, "o");
+ Parameters p = new Parameters();
+ ParameterRef con = p.addParameter(conType, "con");
+ ParameterRef o = p.addParameter(type, "o");
List<String> body = new ArrayList<>();
- body.add("try(" + psType.name + " stmt = " + con.name + ".prepareStatement(insertIntoSql)) {");
+ body.add("try(" + psType + " stmt = " + con.name + ".prepareStatement(insertIntoSql)) {");
for (int i = 0; i < fields.size(); i++) {
FieldMirror field = fields.get(i);
if(field instanceof PrimitiveFieldMirror) {
TypeHandler typeHandler = generatorConfiguration.typeHandler(field.type);
- body.add(" stmt." + typeHandler.setter(i + 1, "o." + field.javaName) + ";");
+ body.add(" stmt." + typeHandler.setter(i + 1, o.name + "." + field.javaName) + ";");
} else if (field instanceof ReferenceFieldMirror) {
ReferenceFieldMirror ref = (ReferenceFieldMirror) field;
EntityMirror referenced = unit.get(ref.type);
FieldMirror idField = referenced.getIdField();
TypeHandler typeHandler = generatorConfiguration.typeHandler(idField.type);
- body.add(" stmt." + typeHandler.setter(i + 1, "o." + field.javaName + "." + idField.javaName) + ";");
+ body.add(" stmt." + typeHandler.setter(i + 1, o.name + "." + field.javaName + "." + idField.javaName) + ";");
}
}
body.add(" stmt.executeUpdate();");
body.add("}");
- g.addStaticMethod(body, TypeRef.VOID, "insertInto", con, object).
+ g.addStaticMethod(body, TypeRef.VOID, "insertInto", p).
exception(g.addImport(SQLException.class));
}
public void delete(ClassG g) {
TypeRef conType = g.addImport(Connection.class);
TypeRef objectType = g.addImport(type);
- ParameterRef con = new ParameterRef(conType, "con");
- ParameterRef o = new ParameterRef(objectType, "o");
+ Parameters p = new Parameters();
+ ParameterRef con = p.addParameter(conType, "con");
+ ParameterRef o = p.addParameter(objectType, "o");
List<String> arguments = new ArrayList<>();
arguments.add(con.name);
@@ -155,32 +173,76 @@ public class EntityMirror implements Comparable<EntityMirror> {
List<String> body = new ArrayList<>();
body.add("deleteById(" + join(arguments, ", ") + ");");
- g.addStaticMethod(body, TypeRef.VOID, "delete", con, o).
+ g.addStaticMethod(body, TypeRef.VOID, "delete", p).
exception(g.addImport(SQLException.class));
}
public void deleteById(ClassG g) {
TypeRef conType = g.addImport(Connection.class);
TypeRef psType = g.addImport(PreparedStatement.class);
- ParameterRef con = new ParameterRef(conType, "con");
-
- ParameterRef[] parameters = new ParameterRef[idFields.size() + 1];
- parameters[0] = con;
+ Parameters p = new Parameters();
+ ParameterRef con = p.addParameter(conType, "con");
List<String> body = new ArrayList<>();
- body.add("try(" + psType.name + " stmt = " + con.name + ".prepareStatement(deleteFromSql)) {");
+ body.add("try(" + psType + " stmt = " + con.name + ".prepareStatement(deleteFromSql)) {");
for (int i = 0; i < idFields.size(); i++) {
FieldMirror field = idFields.get(i);
+ p.addParameter(field.type, field.javaName);
TypeHandler typeHandler = generatorConfiguration.typeHandler(field.type);
- ParameterRef p = new ParameterRef(field.type, field.javaName);
- parameters[i + 1] = p;
body.add(" stmt." + typeHandler.setter(i + 1, field.javaName) + ";");
}
body.add(" stmt.executeUpdate();");
body.add("}");
- g.addStaticMethod(body, TypeRef.VOID, "deleteById", parameters).
+ g.addStaticMethod(body, TypeRef.VOID, "deleteById", p).
+ exception(g.addImport(SQLException.class));
+ }
+
+ public void query(SqlUnitModel sqlUnit, ClassG g) {
+ TypeRef conType = g.addImport(Connection.class);
+ TypeRef abstractQueryType = g.addImport(AbstractTypedQuery.class).args(type);
+ TypeRef typedQueryType = g.addImport(TypedQuery.class).args(type);
+
+ Parameters p = new Parameters();
+ ParameterRef c = p.addParameter(conType, "c");
+
+ ClassG typedQuery = g.addInnerClass(PUBLIC | STATIC, new TypeRef(type.className + "TypedQuery")).
+ extendsType(abstractQueryType);
+ typedQuery.addConstructor(p, singletonList("super(" + c.name + ", " + daoType.className + ".desc);"));
+ fromResultSet(sqlUnit, typedQuery);
+
+ List<String> body = new ArrayList<>();
+ body.add("return new " + typedQuery.type + "(" + c.name + ");");
+ g.addStaticMethod(body, typedQueryType, "query", p);
+ }
+
+ public void fromResultSet(SqlUnitModel unit, ClassG g) {
+ TypeRef rsType = g.addImport(ResultSet.class);
+ Parameters p = new Parameters();
+ ParameterRef rs = p.addParameter(rsType, "rs");
+
+ List<String> body = new ArrayList<>();
+ List<String> names = new ArrayList<>();
+ for (int i = 0; i < fields.size(); i++) {
+ FieldMirror field = fields.get(i);
+ if(field instanceof PrimitiveFieldMirror) {
+ TypeHandler typeHandler = generatorConfiguration.typeHandler(field.type);
+ body.add(field.type + " " + field.javaName + " = " + typeHandler.getter(rs.name, i + 1) + ";");
+ } else if (field instanceof ReferenceFieldMirror) {
+ ReferenceFieldMirror ref = (ReferenceFieldMirror) field;
+ EntityMirror referenced = unit.get(ref.type);
+ FieldMirror idField = referenced.getIdField();
+ TypeHandler typeHandler = generatorConfiguration.typeHandler(idField.type);
+// body.add(field.type + " " + field.javaName + " = " + typeHandler.getter(rs.name, i + 1) + ";");
+ body.add(field.type + " " + field.javaName + " = null;");
+ }
+ names.add(field.javaName);
+ }
+
+ body.add("return new " + type + "(" + join(names, ", ") + ");");
+
+ g.addMethod(body, type, "fromResultSet", p).
exception(g.addImport(SQLException.class));
}
@@ -200,7 +262,7 @@ public class EntityMirror implements Comparable<EntityMirror> {
}
@Override
- public int compareTo(EntityMirror o) {
+ public int compareTo(@SuppressWarnings("NullableProblems") EntityMirror o) {
return type.compareTo(o.type);
}
}