This commit is contained in:
@@ -168,6 +168,36 @@ public class DataSourceService implements DataSource, Service, AutoCloseable {
|
||||
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
|
||||
public <T> boolean exists(final Class<T> clazz, final Serializable pk) {
|
||||
return source.exists(clazz, pk);
|
||||
|
||||
@@ -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
|
||||
public <T> boolean exists(Class<T> clazz, Serializable pk) {
|
||||
final EntityInfo<T> info = loadEntityInfo(clazz);
|
||||
|
||||
@@ -126,6 +126,18 @@ public interface DataSource {
|
||||
|
||||
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 FilterBean bean);
|
||||
|
||||
@@ -138,6 +138,35 @@ public final class EntityCache<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) {
|
||||
if (id == null) return false;
|
||||
final Class atype = this.primary.type();
|
||||
|
||||
Reference in New Issue
Block a user