This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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++) {
|
||||
|
||||
Reference in New Issue
Block a user