|
@@ -4,12 +4,10 @@ import java.util.List;
|
|
|
import java.lang.reflect.Field;
|
|
|
import java.lang.reflect.InvocationTargetException;
|
|
|
import java.math.BigDecimal;
|
|
|
-import java.math.BigInteger;
|
|
|
import java.sql.SQLException;
|
|
|
import java.util.ArrayList;
|
|
|
import java.util.HashMap;
|
|
|
import java.util.Map;
|
|
|
-import java.util.Map.Entry;
|
|
|
import java.util.Optional;
|
|
|
|
|
|
import db.annotation.DbField;
|
|
@@ -45,8 +43,10 @@ public abstract class Table<T extends Persistable> {
|
|
|
return list;
|
|
|
}
|
|
|
|
|
|
- public List<T> getWhere() {
|
|
|
- return null;
|
|
|
+ public List<T> getWhere(List<String> where, List<Object> params) {
|
|
|
+ List<T> list = getWhereFromDb(where, params);
|
|
|
+ list.forEach(elt -> cache(elt));
|
|
|
+ return list;
|
|
|
}
|
|
|
|
|
|
public List<T> getAll() {
|
|
@@ -82,7 +82,33 @@ public abstract class Table<T extends Persistable> {
|
|
|
}
|
|
|
|
|
|
public final void delete(long id) {
|
|
|
-
|
|
|
+ DbTable dbTable = getDbTableAnnotation();
|
|
|
+ // Cherche l'id
|
|
|
+ String idField = null;
|
|
|
+ for(Field field : dbTable.entity().getFields()) {
|
|
|
+ if(!field.isAnnotationPresent(DbId.class)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ // Lecture du nom de l'id dans la base
|
|
|
+ if(field.isAnnotationPresent(DbField.class)) {
|
|
|
+ idField = field.getAnnotation(DbField.class).name();
|
|
|
+ } else {
|
|
|
+ throw new IllegalStateException("Unable to find DbField annotation on id");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (idField == null) {
|
|
|
+ throw new IllegalStateException("Unable to find find DbField annotation");
|
|
|
+ }
|
|
|
+ // Requete SQL
|
|
|
+ String sql = "Delete From " + dbTable.name() + " Where " + idField + " = ?";
|
|
|
+ List<Object> params = new ArrayList<>();
|
|
|
+ params.add(id);
|
|
|
+ // Execution requete
|
|
|
+ if (!Database.execute(sql, params)) {
|
|
|
+ throw new IllegalStateException("Unable to delete data");
|
|
|
+ }
|
|
|
+ // Retire du cache
|
|
|
+ remove(id);
|
|
|
}
|
|
|
|
|
|
public void delete(T obj) {
|
|
@@ -99,6 +125,12 @@ public abstract class Table<T extends Persistable> {
|
|
|
//cacheMap.forEach((key, val) -> System.out.println("Cache: " + key));
|
|
|
}
|
|
|
|
|
|
+ private void remove(long id) {
|
|
|
+ if (cacheMap.containsKey(id)) {
|
|
|
+ cacheMap.remove(id);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
private DbTable getDbTableAnnotation() {
|
|
|
Class<?> clazz = this.getClass();
|
|
|
// Recupération info anotation DbTable
|
|
@@ -180,6 +212,38 @@ public abstract class Table<T extends Persistable> {
|
|
|
return result.get();
|
|
|
}
|
|
|
|
|
|
+ private List<T> getWhereFromDb(List<String> fields, List<Object> params) {
|
|
|
+ DbTable dbTable = getDbTableAnnotation();
|
|
|
+ // Requete sql
|
|
|
+ StringBuilder sql = new StringBuilder();
|
|
|
+ sql.append("Select * From " + dbTable.name() + "Where 1=1");
|
|
|
+ fields.forEach(elt -> sql.append(" And elt = ?"));
|
|
|
+ // Execution requete
|
|
|
+ Optional<List<T>> result = Database.query(sql.toString(), params, rs -> {
|
|
|
+ try {
|
|
|
+ List<T> list = new ArrayList<>();
|
|
|
+ while(rs.next()) {
|
|
|
+ T obj = (T) dbTable.entity().getConstructor().newInstance();
|
|
|
+ for(Field field : dbTable.entity().getFields()) {
|
|
|
+ if(!field.isAnnotationPresent(DbField.class)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ obj.getClass().getField(field.getName()).set(obj, rs.getObject(field.getAnnotation(DbField.class).name()));
|
|
|
+ }
|
|
|
+ list.add(obj);
|
|
|
+ }
|
|
|
+ return list;
|
|
|
+ } catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException | NoSuchFieldException | SQLException e) {
|
|
|
+ throw new IllegalStateException("Unable to map value to the entity");
|
|
|
+ }
|
|
|
+ });
|
|
|
+ // Return
|
|
|
+ if(result.isEmpty()) {
|
|
|
+ return new ArrayList<>();
|
|
|
+ }
|
|
|
+ return result.get();
|
|
|
+ }
|
|
|
+
|
|
|
private List<T> getAllFromDb() {
|
|
|
DbTable dbTable = getDbTableAnnotation();
|
|
|
// Requete sql
|