This commit is contained in:
Redkale
2017-01-10 16:42:41 +08:00
parent eaae598234
commit 3c457dad2a
4 changed files with 151 additions and 0 deletions

View File

@@ -168,6 +168,36 @@ public class DataSourceService implements DataSource, Service, AutoCloseable {
return source.find(clazz, selects, node); return source.find(clazz, selects, node);
} }
@Override
public <T> Serializable findColumn(final Class<T> clazz, final String column, final Serializable pk) {
return source.findColumn(clazz, column, pk);
}
@Override
public <T> Serializable findColumn(final Class<T> clazz, final String column, final FilterBean bean) {
return source.findColumn(clazz, column, bean);
}
@Override
public <T> Serializable findColumn(final Class<T> clazz, final String column, final FilterNode node) {
return source.findColumn(clazz, column, node);
}
@Override
public <T> Serializable findColumn(final Class<T> clazz, final String column, final Serializable defValue, final Serializable pk) {
return source.findColumn(clazz, column, defValue, pk);
}
@Override
public <T> Serializable findColumn(final Class<T> clazz, final String column, final Serializable defValue, final FilterBean bean) {
return source.findColumn(clazz, column, defValue, bean);
}
@Override
public <T> Serializable findColumn(final Class<T> clazz, final String column, final Serializable defValue, final FilterNode node) {
return source.findColumn(clazz, column, defValue, node);
}
@Override @Override
public <T> boolean exists(final Class<T> clazz, final Serializable pk) { public <T> boolean exists(final Class<T> clazz, final Serializable pk) {
return source.exists(clazz, pk); return source.exists(clazz, pk);

View File

@@ -1319,6 +1319,86 @@ public final class DataDefaultSource implements DataSource, Function<Class, Enti
} }
} }
@Override
public <T> Serializable findColumn(final Class<T> clazz, final String column, final Serializable pk) {
return findColumn(clazz, column, null, pk);
}
@Override
public <T> Serializable findColumn(final Class<T> clazz, final String column, final FilterBean bean) {
return findColumn(clazz, column, null, FilterNodeBean.createFilterNode(bean));
}
@Override
public <T> Serializable findColumn(final Class<T> clazz, final String column, final FilterNode node) {
return findColumn(clazz, column, null, node);
}
@Override
public <T> Serializable findColumn(final Class<T> clazz, final String column, final Serializable defValue, final Serializable pk) {
final EntityInfo<T> info = loadEntityInfo(clazz);
final EntityCache<T> cache = info.getCache();
if (cache != null) {
Serializable val = cache.findColumn(column, defValue, pk);
if (cache.isFullLoaded() || val != null) return val;
}
final Connection conn = createReadSQLConnection();
try {
final String sql = "SELECT " + info.getSQLColumn(null, column) + " FROM " + info.getTable(pk) + " WHERE " + info.getPrimarySQLColumn() + " = " + FilterNode.formatToString(pk);
if (debug.get() && info.isLoggable(Level.FINEST)) logger.finest(clazz.getSimpleName() + " find sql=" + sql);
final PreparedStatement ps = conn.prepareStatement(sql, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
final ResultSet set = ps.executeQuery();
Serializable val = defValue;
if (set.next()) val = (Serializable) set.getObject(1);
set.close();
ps.close();
return val == null ? defValue : val;
} catch (SQLException sex) {
if (info.tableStrategy != null && info.tablenotexistSqlstates.contains(';' + sex.getSQLState() + ';')) return defValue;
throw new RuntimeException(sex);
} catch (Exception ex) {
throw new RuntimeException(ex);
} finally {
closeSQLConnection(conn);
}
}
@Override
public <T> Serializable findColumn(final Class<T> clazz, final String column, final Serializable defValue, final FilterBean bean) {
return findColumn(clazz, column, defValue, FilterNodeBean.createFilterNode(bean));
}
@Override
public <T> Serializable findColumn(final Class<T> clazz, final String column, final Serializable defValue, final FilterNode node) {
final EntityInfo<T> info = loadEntityInfo(clazz);
final EntityCache<T> cache = info.getCache();
if (cache != null && cache.isFullLoaded() && (node == null || node.isCacheUseable(this))) return cache.findColumn(column, defValue, node);
final Connection conn = createReadSQLConnection();
try {
final Map<Class, String> joinTabalis = node == null ? null : node.getJoinTabalis();
final CharSequence join = node == null ? null : node.createSQLJoin(this, false, joinTabalis, new HashSet<>(), info);
final CharSequence where = node == null ? null : node.createSQLExpress(info, joinTabalis);
final String sql = "SELECT " + info.getSQLColumn("a", column) + " FROM " + info.getTable(node) + " a" + (join == null ? "" : join) + ((where == null || where.length() == 0) ? "" : (" WHERE " + where));
if (debug.get() && info.isLoggable(Level.FINEST)) logger.finest(clazz.getSimpleName() + " find sql=" + sql);
final PreparedStatement ps = conn.prepareStatement(sql, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
final ResultSet set = ps.executeQuery();
Serializable val = defValue;
if (set.next()) val = (Serializable) set.getObject(1);
set.close();
ps.close();
return val == null ? defValue : val;
} catch (SQLException se) {
if (info.tableStrategy != null && info.tablenotexistSqlstates.contains(';' + se.getSQLState() + ';')) return defValue;
throw new RuntimeException(se);
} catch (Exception ex) {
throw new RuntimeException(ex);
} finally {
closeSQLConnection(conn);
}
}
@Override @Override
public <T> boolean exists(Class<T> clazz, Serializable pk) { public <T> boolean exists(Class<T> clazz, Serializable pk) {
final EntityInfo<T> info = loadEntityInfo(clazz); final EntityInfo<T> info = loadEntityInfo(clazz);

View File

@@ -126,6 +126,18 @@ public interface DataSource {
public <T> T find(final Class<T> clazz, final SelectColumn selects, final FilterNode node); public <T> T find(final Class<T> clazz, final SelectColumn selects, final FilterNode node);
public <T> Serializable findColumn(final Class<T> clazz, final String column, final Serializable pk);
public <T> Serializable findColumn(final Class<T> clazz, final String column, final FilterBean bean);
public <T> Serializable findColumn(final Class<T> clazz, final String column, final FilterNode node);
public <T> Serializable findColumn(final Class<T> clazz, final String column, final Serializable defValue, final Serializable pk);
public <T> Serializable findColumn(final Class<T> clazz, final String column, final Serializable defValue, final FilterBean bean);
public <T> Serializable findColumn(final Class<T> clazz, final String column, final Serializable defValue, final FilterNode node);
public <T> boolean exists(final Class<T> clazz, final Serializable pk); public <T> boolean exists(final Class<T> clazz, final Serializable pk);
public <T> boolean exists(final Class<T> clazz, final FilterBean bean); public <T> boolean exists(final Class<T> clazz, final FilterBean bean);

View File

@@ -138,6 +138,35 @@ public final class EntityCache<T> {
return t; return t;
} }
public Serializable findColumn(final String column, final Serializable defValue, final Serializable id) {
if (id == null) return defValue;
T rs = map.get(id);
if (rs == null) return defValue;
for (Attribute attr : this.info.attributes) {
if (column.equals(attr.field())) {
Serializable val = (Serializable) attr.get(rs);
return val == null ? defValue : val;
}
}
return defValue;
}
public Serializable findColumn(final String column, final Serializable defValue, FilterNode node) {
final Predicate<T> filter = node == null ? null : node.createPredicate(this);
Stream<T> stream = this.list.stream();
if (filter != null) stream = stream.filter(filter);
Optional<T> opt = stream.findFirst();
if (!opt.isPresent()) return defValue;
T rs = opt.get();
for (Attribute attr : this.info.attributes) {
if (column.equals(attr.field())) {
Serializable val = (Serializable) attr.get(rs);
return val == null ? defValue : val;
}
}
return defValue;
}
public boolean exists(Serializable id) { public boolean exists(Serializable id) {
if (id == null) return false; if (id == null) return false;
final Class atype = this.primary.type(); final Class atype = this.primary.type();