diff --git a/src/nl/astraeus/database/FieldMetaData.java b/src/nl/astraeus/database/FieldMetaData.java index a847420..02a2ec0 100644 --- a/src/nl/astraeus/database/FieldMetaData.java +++ b/src/nl/astraeus/database/FieldMetaData.java @@ -327,13 +327,17 @@ case REFERENCE: id = rs.getLong(index); - Object object = Persister.find(javaType, id); + if (id > 0L) { + Object object = Persister.find(javaType, id); - if (object == null) { - logger.warn("Missing reference detected "+field.getDeclaringClass().getSimpleName()+"."+getFieldName()+":"+id); + if (object == null) { + logger.warn("Missing reference detected "+field.getDeclaringClass().getSimpleName()+"."+getFieldName()+":"+id); + } + + set(obj, object); + } else { + set(obj, null); } - - set(obj, object); break; case COLLECTION: Blob blob = rs.getBlob(index); @@ -356,9 +360,7 @@ ObjectInputStream ois = new ObjectInputStream(bais)) { set(obj, ois.readObject()); - } catch (ClassNotFoundException e) { - throw new IllegalStateException(e); - } catch (IOException e) { + } catch (ClassNotFoundException | IOException e) { throw new IllegalStateException(e); } break; @@ -375,13 +377,17 @@ Long id = meta.getId(current); - Object object = Persister.find(javaType, id); + if (id != null && id > 0) { + Object object = Persister.find(javaType, id); - if (object == null) { - logger.warn("Missing reference detected "+field.getDeclaringClass().getSimpleName()+"."+getFieldName()+":"+id); + if (object == null) { + logger.warn("Missing reference detected "+field.getDeclaringClass().getSimpleName()+"."+getFieldName()+":"+id); + } + + set(result, object); + } else { + set(result, null); } - - set(result, object); } } diff --git a/src/nl/astraeus/database/FieldMetaData.java b/src/nl/astraeus/database/FieldMetaData.java index a847420..02a2ec0 100644 --- a/src/nl/astraeus/database/FieldMetaData.java +++ b/src/nl/astraeus/database/FieldMetaData.java @@ -327,13 +327,17 @@ case REFERENCE: id = rs.getLong(index); - Object object = Persister.find(javaType, id); + if (id > 0L) { + Object object = Persister.find(javaType, id); - if (object == null) { - logger.warn("Missing reference detected "+field.getDeclaringClass().getSimpleName()+"."+getFieldName()+":"+id); + if (object == null) { + logger.warn("Missing reference detected "+field.getDeclaringClass().getSimpleName()+"."+getFieldName()+":"+id); + } + + set(obj, object); + } else { + set(obj, null); } - - set(obj, object); break; case COLLECTION: Blob blob = rs.getBlob(index); @@ -356,9 +360,7 @@ ObjectInputStream ois = new ObjectInputStream(bais)) { set(obj, ois.readObject()); - } catch (ClassNotFoundException e) { - throw new IllegalStateException(e); - } catch (IOException e) { + } catch (ClassNotFoundException | IOException e) { throw new IllegalStateException(e); } break; @@ -375,13 +377,17 @@ Long id = meta.getId(current); - Object object = Persister.find(javaType, id); + if (id != null && id > 0) { + Object object = Persister.find(javaType, id); - if (object == null) { - logger.warn("Missing reference detected "+field.getDeclaringClass().getSimpleName()+"."+getFieldName()+":"+id); + if (object == null) { + logger.warn("Missing reference detected "+field.getDeclaringClass().getSimpleName()+"."+getFieldName()+":"+id); + } + + set(result, object); + } else { + set(result, null); } - - set(result, object); } } diff --git a/src/nl/astraeus/database/MetaData.java b/src/nl/astraeus/database/MetaData.java index b975b92..7f7317d 100644 --- a/src/nl/astraeus/database/MetaData.java +++ b/src/nl/astraeus/database/MetaData.java @@ -222,19 +222,10 @@ ResultSet rs = statement.executeQuery(); if (rs.next()) { - result = (T)cls.newInstance(); - int index = 1; - - for (FieldMetaData meta : fieldsMetaData) { - meta.set(rs, index++, result); - } + result = getFromResultSet(rs); } return result; - } catch (InstantiationException e) { - throw new IllegalStateException(e); - } catch (IllegalAccessException e) { - throw new IllegalStateException(e); } finally { if (statement != null) { statement.close(); @@ -244,6 +235,22 @@ }); } + private T getFromResultSet(ResultSet rs) { + T result = null; + try { + result = (T)cls.newInstance(); + int index = 1; + + for (FieldMetaData meta : fieldsMetaData) { + meta.set(rs, index++, result); + } + + return result; + } catch (InstantiationException | SQLException | IllegalAccessException e) { + throw new IllegalStateException (e); + } + } + protected void insert(T object) { PreparedStatement statement = null; @@ -328,6 +335,11 @@ } } + public List selectAll() { + return selectFrom("order by "+pk.getColumnInfo().getName(), new Object [0]); + } + + public List selectFrom(String query, final Object[] params) { List result; SimpleTemplate fromTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_FROM); @@ -420,6 +432,19 @@ return result; } + public T findWhere(String query, final Object[] params) { + List results = selectWhere(query, params); + T result = null; + + if (results.size() == 1) { + result = results.get(0); + } else if (results.size() > 1) { + throw new IllegalStateException("Finder found more than one row! ["+query+"]"); + } + + return result; + } + private void setStatementParameter(PreparedStatement statement, int index, Object param) throws SQLException { if (param.getClass().equals(String.class)) { statement.setString(index, (String) param); diff --git a/src/nl/astraeus/database/FieldMetaData.java b/src/nl/astraeus/database/FieldMetaData.java index a847420..02a2ec0 100644 --- a/src/nl/astraeus/database/FieldMetaData.java +++ b/src/nl/astraeus/database/FieldMetaData.java @@ -327,13 +327,17 @@ case REFERENCE: id = rs.getLong(index); - Object object = Persister.find(javaType, id); + if (id > 0L) { + Object object = Persister.find(javaType, id); - if (object == null) { - logger.warn("Missing reference detected "+field.getDeclaringClass().getSimpleName()+"."+getFieldName()+":"+id); + if (object == null) { + logger.warn("Missing reference detected "+field.getDeclaringClass().getSimpleName()+"."+getFieldName()+":"+id); + } + + set(obj, object); + } else { + set(obj, null); } - - set(obj, object); break; case COLLECTION: Blob blob = rs.getBlob(index); @@ -356,9 +360,7 @@ ObjectInputStream ois = new ObjectInputStream(bais)) { set(obj, ois.readObject()); - } catch (ClassNotFoundException e) { - throw new IllegalStateException(e); - } catch (IOException e) { + } catch (ClassNotFoundException | IOException e) { throw new IllegalStateException(e); } break; @@ -375,13 +377,17 @@ Long id = meta.getId(current); - Object object = Persister.find(javaType, id); + if (id != null && id > 0) { + Object object = Persister.find(javaType, id); - if (object == null) { - logger.warn("Missing reference detected "+field.getDeclaringClass().getSimpleName()+"."+getFieldName()+":"+id); + if (object == null) { + logger.warn("Missing reference detected "+field.getDeclaringClass().getSimpleName()+"."+getFieldName()+":"+id); + } + + set(result, object); + } else { + set(result, null); } - - set(result, object); } } diff --git a/src/nl/astraeus/database/MetaData.java b/src/nl/astraeus/database/MetaData.java index b975b92..7f7317d 100644 --- a/src/nl/astraeus/database/MetaData.java +++ b/src/nl/astraeus/database/MetaData.java @@ -222,19 +222,10 @@ ResultSet rs = statement.executeQuery(); if (rs.next()) { - result = (T)cls.newInstance(); - int index = 1; - - for (FieldMetaData meta : fieldsMetaData) { - meta.set(rs, index++, result); - } + result = getFromResultSet(rs); } return result; - } catch (InstantiationException e) { - throw new IllegalStateException(e); - } catch (IllegalAccessException e) { - throw new IllegalStateException(e); } finally { if (statement != null) { statement.close(); @@ -244,6 +235,22 @@ }); } + private T getFromResultSet(ResultSet rs) { + T result = null; + try { + result = (T)cls.newInstance(); + int index = 1; + + for (FieldMetaData meta : fieldsMetaData) { + meta.set(rs, index++, result); + } + + return result; + } catch (InstantiationException | SQLException | IllegalAccessException e) { + throw new IllegalStateException (e); + } + } + protected void insert(T object) { PreparedStatement statement = null; @@ -328,6 +335,11 @@ } } + public List selectAll() { + return selectFrom("order by "+pk.getColumnInfo().getName(), new Object [0]); + } + + public List selectFrom(String query, final Object[] params) { List result; SimpleTemplate fromTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_FROM); @@ -420,6 +432,19 @@ return result; } + public T findWhere(String query, final Object[] params) { + List results = selectWhere(query, params); + T result = null; + + if (results.size() == 1) { + result = results.get(0); + } else if (results.size() > 1) { + throw new IllegalStateException("Finder found more than one row! ["+query+"]"); + } + + return result; + } + private void setStatementParameter(PreparedStatement statement, int index, Object param) throws SQLException { if (param.getClass().equals(String.class)) { statement.setString(index, (String) param); diff --git a/src/nl/astraeus/database/ObjectPersister.java b/src/nl/astraeus/database/ObjectPersister.java index bde1912..8f6f993 100644 --- a/src/nl/astraeus/database/ObjectPersister.java +++ b/src/nl/astraeus/database/ObjectPersister.java @@ -40,10 +40,6 @@ } public T find(long id) { - if (Cache.get().inCache(cls, id)) { - return Cache.get().get(cls, id); - } - T result = (T) metaData.find(id); Cache.get().set(cls, id, result); @@ -51,6 +47,10 @@ return result; } + public List selectAll() { + return metaData.selectAll(); + } + public List selectFrom(String query, Object... params) { return metaData.selectFrom(query, params); } @@ -59,4 +59,8 @@ return metaData.selectWhere(query, params); } + public T findWhere(String query, Object ... params) { + return (T) metaData.findWhere(query, params); + } + } diff --git a/src/nl/astraeus/database/FieldMetaData.java b/src/nl/astraeus/database/FieldMetaData.java index a847420..02a2ec0 100644 --- a/src/nl/astraeus/database/FieldMetaData.java +++ b/src/nl/astraeus/database/FieldMetaData.java @@ -327,13 +327,17 @@ case REFERENCE: id = rs.getLong(index); - Object object = Persister.find(javaType, id); + if (id > 0L) { + Object object = Persister.find(javaType, id); - if (object == null) { - logger.warn("Missing reference detected "+field.getDeclaringClass().getSimpleName()+"."+getFieldName()+":"+id); + if (object == null) { + logger.warn("Missing reference detected "+field.getDeclaringClass().getSimpleName()+"."+getFieldName()+":"+id); + } + + set(obj, object); + } else { + set(obj, null); } - - set(obj, object); break; case COLLECTION: Blob blob = rs.getBlob(index); @@ -356,9 +360,7 @@ ObjectInputStream ois = new ObjectInputStream(bais)) { set(obj, ois.readObject()); - } catch (ClassNotFoundException e) { - throw new IllegalStateException(e); - } catch (IOException e) { + } catch (ClassNotFoundException | IOException e) { throw new IllegalStateException(e); } break; @@ -375,13 +377,17 @@ Long id = meta.getId(current); - Object object = Persister.find(javaType, id); + if (id != null && id > 0) { + Object object = Persister.find(javaType, id); - if (object == null) { - logger.warn("Missing reference detected "+field.getDeclaringClass().getSimpleName()+"."+getFieldName()+":"+id); + if (object == null) { + logger.warn("Missing reference detected "+field.getDeclaringClass().getSimpleName()+"."+getFieldName()+":"+id); + } + + set(result, object); + } else { + set(result, null); } - - set(result, object); } } diff --git a/src/nl/astraeus/database/MetaData.java b/src/nl/astraeus/database/MetaData.java index b975b92..7f7317d 100644 --- a/src/nl/astraeus/database/MetaData.java +++ b/src/nl/astraeus/database/MetaData.java @@ -222,19 +222,10 @@ ResultSet rs = statement.executeQuery(); if (rs.next()) { - result = (T)cls.newInstance(); - int index = 1; - - for (FieldMetaData meta : fieldsMetaData) { - meta.set(rs, index++, result); - } + result = getFromResultSet(rs); } return result; - } catch (InstantiationException e) { - throw new IllegalStateException(e); - } catch (IllegalAccessException e) { - throw new IllegalStateException(e); } finally { if (statement != null) { statement.close(); @@ -244,6 +235,22 @@ }); } + private T getFromResultSet(ResultSet rs) { + T result = null; + try { + result = (T)cls.newInstance(); + int index = 1; + + for (FieldMetaData meta : fieldsMetaData) { + meta.set(rs, index++, result); + } + + return result; + } catch (InstantiationException | SQLException | IllegalAccessException e) { + throw new IllegalStateException (e); + } + } + protected void insert(T object) { PreparedStatement statement = null; @@ -328,6 +335,11 @@ } } + public List selectAll() { + return selectFrom("order by "+pk.getColumnInfo().getName(), new Object [0]); + } + + public List selectFrom(String query, final Object[] params) { List result; SimpleTemplate fromTemplate = DdlMapping.get().getQueryTemplate(DdlMapping.QueryTemplates.SELECT_FROM); @@ -420,6 +432,19 @@ return result; } + public T findWhere(String query, final Object[] params) { + List results = selectWhere(query, params); + T result = null; + + if (results.size() == 1) { + result = results.get(0); + } else if (results.size() > 1) { + throw new IllegalStateException("Finder found more than one row! ["+query+"]"); + } + + return result; + } + private void setStatementParameter(PreparedStatement statement, int index, Object param) throws SQLException { if (param.getClass().equals(String.class)) { statement.setString(index, (String) param); diff --git a/src/nl/astraeus/database/ObjectPersister.java b/src/nl/astraeus/database/ObjectPersister.java index bde1912..8f6f993 100644 --- a/src/nl/astraeus/database/ObjectPersister.java +++ b/src/nl/astraeus/database/ObjectPersister.java @@ -40,10 +40,6 @@ } public T find(long id) { - if (Cache.get().inCache(cls, id)) { - return Cache.get().get(cls, id); - } - T result = (T) metaData.find(id); Cache.get().set(cls, id, result); @@ -51,6 +47,10 @@ return result; } + public List selectAll() { + return metaData.selectAll(); + } + public List selectFrom(String query, Object... params) { return metaData.selectFrom(query, params); } @@ -59,4 +59,8 @@ return metaData.selectWhere(query, params); } + public T findWhere(String query, Object ... params) { + return (T) metaData.findWhere(query, params); + } + } diff --git a/src/nl/astraeus/database/Persister.java b/src/nl/astraeus/database/Persister.java index f8d4cbb..51ced98 100644 --- a/src/nl/astraeus/database/Persister.java +++ b/src/nl/astraeus/database/Persister.java @@ -128,6 +128,10 @@ return Persister.selectWhere(cls, query, params); } + protected static T findWhere(Class cls, String query, Object ... params) { + return Persister.findWhere(cls, query, params); + } + public abstract void execute(); } @@ -197,13 +201,17 @@ } public static List selectAll(Class cls) { - return getObjectPersister(cls).selectFrom(""); + return getObjectPersister(cls).selectAll(); } public static List selectWhere(Class cls, String query, Object ... params) { return getObjectPersister(cls).selectWhere(query, params); } + public static T findWhere(Class cls, String query, Object ... params) { + return getObjectPersister(cls).findWhere(query, params); + } + private static ObjectPersister getObjectPersister(Class cls) { ObjectPersister result = objectPersisters.get(cls);