This commit is contained in:
Redkale
2016-12-11 19:10:51 +08:00
parent a8bc50a947
commit d9a268d30a
4 changed files with 45 additions and 7 deletions

View File

@@ -73,6 +73,11 @@ public class DataSourceService implements DataSource, Service, AutoCloseable {
return source.updateColumn(clazz, node, values);
}
@Override
public <T> int updateColumn(final Class<T> clazz, final FilterNode node, final Flipper flipper, final ColumnValue... values) {
return source.updateColumn(clazz, node, flipper, values);
}
@Override
public <T> int updateColumns(T bean, final String... columns) {
return source.updateColumns(bean, columns);

View File

@@ -853,17 +853,42 @@ public final class DataDefaultSource implements DataSource, Function<Class, Enti
public <T> int updateColumn(final Class<T> clazz, final FilterNode node, final ColumnValue... values) {
final EntityInfo<T> info = loadEntityInfo(clazz);
if (info.isVirtualEntity()) {
return updateColumn(null, info, node, values);
return updateColumn(null, info, node, null, values);
}
Connection conn = createWriteSQLConnection();
try {
return updateColumn(conn, info, node, values);
return updateColumn(conn, info, node, null, values);
} finally {
closeSQLConnection(conn);
}
}
private <T> int updateColumn(final Connection conn, final EntityInfo<T> info, final FilterNode node, final ColumnValue... values) {
/**
* 根据主键值更新对象的多个column对应的值 必须是Entity Class
*
* @param <T> Entity类的泛型
* @param clazz Entity类
* @param node 过滤条件
* @param flipper 翻页对象
* @param values 字段值
*
* @return 更新的数据条数
*/
@Override
public <T> int updateColumn(final Class<T> clazz, final FilterNode node, final Flipper flipper, final ColumnValue... values) {
final EntityInfo<T> info = loadEntityInfo(clazz);
if (info.isVirtualEntity()) {
return updateColumn(null, info, node, flipper, values);
}
Connection conn = createWriteSQLConnection();
try {
return updateColumn(conn, info, node, flipper, values);
} finally {
closeSQLConnection(conn);
}
}
private <T> int updateColumn(final Connection conn, final EntityInfo<T> info, final FilterNode node, final Flipper flipper, final ColumnValue... values) {
if (values == null || values.length < 1) return -1;
try {
StringBuilder setsql = new StringBuilder();
@@ -887,7 +912,9 @@ public final class DataDefaultSource implements DataSource, Function<Class, Enti
CharSequence join = node.createSQLJoin(this, joinTabalis, info);
CharSequence where = node.createSQLExpress(info, joinTabalis);
String sql = "UPDATE " + info.getTable(node) + " a SET " + setsql + (join == null ? "" : join) + ((where == null || where.length() == 0) ? "" : (" WHERE " + where));
String sql = "UPDATE " + info.getTable(node) + " a SET " + setsql + (join == null ? "" : join)
+ ((where == null || where.length() == 0) ? "" : (" WHERE " + where)) + info.createSQLOrderby(flipper)
+ (flipper == null ? "" : (" LIMIT " + flipper.getLimit())); //注仅支持MySQL
if (debug.get() && info.isLoggable(Level.FINEST)) logger.finest(info.getType().getSimpleName() + " update sql=" + sql);
final Statement stmt = conn.createStatement();
c = stmt.executeUpdate(sql);
@@ -896,7 +923,7 @@ public final class DataDefaultSource implements DataSource, Function<Class, Enti
//---------------------------------------------------
final EntityCache<T> cache = info.getCache();
if (cache == null) return c;
T[] rs = cache.updateColumn(node, attrs, cols);
T[] rs = cache.updateColumn(node, flipper, attrs, cols);
if (cacheListener != null) cacheListener.updateCache(info.getType(), rs);
return c >= 0 ? c : (rs == null ? 0 : rs.length);
} catch (SQLException e) {

View File

@@ -76,6 +76,8 @@ public interface DataSource {
public <T> int updateColumn(final Class<T> clazz, final FilterNode node, final ColumnValue... values);
public <T> int updateColumn(final Class<T> clazz, final FilterNode node, final Flipper flipper, final ColumnValue... values);
public <T> int updateColumns(final T bean, final String... columns);
public <T> int updateColumns(final T bean, final FilterNode node, final String... columns);

View File

@@ -449,9 +449,13 @@ public final class EntityCache<T> {
return rs;
}
public <V> T[] updateColumn(final FilterNode node, List<Attribute<T, Serializable>> attrs, final List<ColumnValue> values) {
public <V> T[] updateColumn(final FilterNode node, final Flipper flipper, List<Attribute<T, Serializable>> attrs, final List<ColumnValue> values) {
if (attrs == null || attrs.isEmpty() || node == null) return (T[]) Array.newInstance(type, 0);
T[] rms = this.list.stream().filter(node.createPredicate(this)).toArray(len -> (T[]) Array.newInstance(type, len));
Stream<T> stream = this.list.stream();
final Comparator<T> comparator = createComparator(flipper);
if (comparator != null) stream = stream.sorted(comparator);
if (flipper != null) stream = stream.limit(flipper.getLimit());
T[] rms = stream.filter(node.createPredicate(this)).toArray(len -> (T[]) Array.newInstance(type, len));
for (T rs : rms) {
synchronized (rs) {
for (int i = 0; i < attrs.size(); i++) {