This commit is contained in:
@@ -95,6 +95,17 @@ public class DataSourceService implements DataSource, Service, AutoCloseable {
|
||||
if (handler != null) handler.completed(null, id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T> void updateColumn(final Class<T> clazz, final String column, final Serializable value, final FilterNode node) {
|
||||
source.updateColumn(clazz, column, value, node);
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T> void updateColumn(final CompletionHandler<Void, FilterNode> handler, final Class<T> clazz, final String column, final Serializable value, @DynAttachment final FilterNode node) {
|
||||
source.updateColumn(clazz, column, value, node);
|
||||
if (handler != null) handler.completed(null, node);
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T> void updateColumnIncrement(final Class<T> clazz, final Serializable id, final String column, long incvalue) {
|
||||
source.updateColumnIncrement(clazz, id, column, incvalue);
|
||||
@@ -139,6 +150,17 @@ public class DataSourceService implements DataSource, Service, AutoCloseable {
|
||||
if (handler != null) handler.completed(null, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T> void updateColumns(T value, final FilterNode node, final String... columns) {
|
||||
source.updateColumns(value, node, columns);
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T> void updateColumns(final CompletionHandler<Void, FilterNode> handler, final T value, @DynAttachment final FilterNode node, final String... columns) {
|
||||
source.updateColumns(value, node, columns);
|
||||
if (handler != null) handler.completed(null, node);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Number getNumberResult(final Class entityClass, FilterFunc func, final String column) {
|
||||
return source.getNumberResult(entityClass, func, column);
|
||||
|
||||
@@ -17,7 +17,6 @@ import java.util.logging.*;
|
||||
import javax.annotation.Resource;
|
||||
import javax.sql.ConnectionPoolDataSource;
|
||||
import javax.xml.stream.*;
|
||||
import static org.redkale.source.FilterNode.formatToString;
|
||||
import org.redkale.util.*;
|
||||
import static org.redkale.source.FilterNode.formatToString;
|
||||
|
||||
@@ -763,6 +762,63 @@ public final class DataDefaultSource implements DataSource, Function<Class, Enti
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据主键值更新对象的column对应的值, 必须是Entity Class
|
||||
*
|
||||
* @param <T> Entity类的泛型
|
||||
* @param clazz Entity类
|
||||
* @param column 过滤字段名
|
||||
* @param value 过滤字段值
|
||||
* @param node 过滤node 不能为null
|
||||
*/
|
||||
@Override
|
||||
public <T> void updateColumn(Class<T> clazz, String column, Serializable value, FilterNode node) {
|
||||
final EntityInfo<T> info = loadEntityInfo(clazz);
|
||||
if (info.isVirtualEntity()) {
|
||||
updateColumn(null, info, column, value, node);
|
||||
return;
|
||||
}
|
||||
Connection conn = createWriteSQLConnection();
|
||||
try {
|
||||
updateColumn(conn, info, column, value, node);
|
||||
} finally {
|
||||
closeSQLConnection(conn);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T> void updateColumn(final CompletionHandler<Void, FilterNode> handler, final Class<T> clazz, final String column, final Serializable value, FilterNode node) {
|
||||
updateColumn(clazz, column, value, node);
|
||||
if (handler != null) handler.completed(null, node);
|
||||
}
|
||||
|
||||
private <T> void updateColumn(Connection conn, final EntityInfo<T> info, String column, Serializable value, FilterNode node) {
|
||||
try {
|
||||
if (!info.isVirtualEntity()) {
|
||||
Map<Class, String> joinTabalis = node.getJoinTabalis();
|
||||
CharSequence join = node.createSQLJoin(this, joinTabalis, info);
|
||||
CharSequence where = node.createSQLExpress(info, joinTabalis);
|
||||
|
||||
String sql = "UPDATE " + info.getTable() + " a SET " + info.getSQLColumn("a", column) + " = "
|
||||
+ formatToString(value) + (join == null ? "" : join) + ((where == null || where.length() == 0) ? "" : (" WHERE " + where));
|
||||
if (debug.get()) logger.finest(info.getType().getSimpleName() + " update sql=" + sql);
|
||||
final Statement stmt = conn.createStatement();
|
||||
stmt.execute(sql);
|
||||
stmt.close();
|
||||
if (writeListener != null) writeListener.update(sql);
|
||||
}
|
||||
//---------------------------------------------------
|
||||
final EntityCache<T> cache = info.getCache();
|
||||
if (cache == null) return;
|
||||
T[] rs = cache.update(info.getAttribute(column), value, node);
|
||||
if (cacheListener != null) cacheListener.updateCache(info.getType(), rs);
|
||||
} catch (SQLException e) {
|
||||
throw new RuntimeException(e);
|
||||
} finally {
|
||||
if (conn != null) closeSQLConnection(conn);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据主键值给对象的column对应的值+incvalue, 必须是Entity Class
|
||||
* 等价SQL: UPDATE {clazz} SET {column} = {column} + {incvalue} WHERE {primary} = {id}
|
||||
@@ -994,6 +1050,75 @@ public final class DataDefaultSource implements DataSource, Function<Class, Enti
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新对象指定的一些字段, 必须是Entity对象
|
||||
*
|
||||
* @param <T> Entity类的泛型
|
||||
* @param value Entity对象
|
||||
* @param node 过滤node 不能为null
|
||||
* @param columns 需要更新的字段
|
||||
*/
|
||||
@Override
|
||||
public <T> void updateColumns(final T value, final FilterNode node, final String... columns) {
|
||||
final EntityInfo<T> info = loadEntityInfo((Class<T>) value.getClass());
|
||||
if (info.isVirtualEntity()) {
|
||||
updateColumns(null, info, value, node, columns);
|
||||
return;
|
||||
}
|
||||
Connection conn = createWriteSQLConnection();
|
||||
try {
|
||||
updateColumns(conn, info, value, node, columns);
|
||||
} finally {
|
||||
closeSQLConnection(conn);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T> void updateColumns(final CompletionHandler<Void, FilterNode> handler, final T value, final FilterNode node, final String... columns) {
|
||||
updateColumns(value, node, columns);
|
||||
if (handler != null) handler.completed(null, node);
|
||||
}
|
||||
|
||||
private <T> void updateColumns(final Connection conn, final EntityInfo<T> info, final T value, final FilterNode node, final String... columns) {
|
||||
if (value == null || node == null || columns.length < 1) return;
|
||||
try {
|
||||
final Class<T> clazz = (Class<T>) value.getClass();
|
||||
StringBuilder setsql = new StringBuilder();
|
||||
final Serializable id = info.getPrimary().get(value);
|
||||
final List<Attribute<T, Serializable>> attrs = new ArrayList<>();
|
||||
final boolean virtual = info.isVirtualEntity();
|
||||
for (String col : columns) {
|
||||
Attribute<T, Serializable> attr = info.getUpdateAttribute(col);
|
||||
if (attr == null) continue;
|
||||
attrs.add(attr);
|
||||
if (!virtual) {
|
||||
if (setsql.length() > 0) setsql.append(", ");
|
||||
setsql.append(info.getSQLColumn("a", col)).append(" = ").append(formatToString(attr.get(value)));
|
||||
}
|
||||
}
|
||||
if (!virtual) {
|
||||
Map<Class, String> joinTabalis = node.getJoinTabalis();
|
||||
CharSequence join = node.createSQLJoin(this, joinTabalis, info);
|
||||
CharSequence where = node.createSQLExpress(info, joinTabalis);
|
||||
|
||||
String sql = "UPDATE " + info.getTable() + " a SET " + setsql
|
||||
+ (join == null ? "" : join) + ((where == null || where.length() == 0) ? "" : (" WHERE " + where));
|
||||
if (debug.get()) logger.finest(info.getType().getSimpleName() + " update sql=" + sql);
|
||||
final Statement stmt = conn.createStatement();
|
||||
stmt.execute(sql);
|
||||
stmt.close();
|
||||
if (writeListener != null) writeListener.update(sql);
|
||||
}
|
||||
//---------------------------------------------------
|
||||
final EntityCache<T> cache = info.getCache();
|
||||
if (cache == null) return;
|
||||
T[] rs = cache.update(value, attrs, node);
|
||||
if (cacheListener != null) cacheListener.updateCache(clazz, rs);
|
||||
} catch (SQLException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public <T> void updateCache(Class<T> clazz, T... values) {
|
||||
if (values.length == 0) return;
|
||||
final EntityInfo<T> info = loadEntityInfo(clazz);
|
||||
@@ -1148,6 +1273,7 @@ public final class DataDefaultSource implements DataSource, Function<Class, Enti
|
||||
* @param <T> Entity类的泛型
|
||||
* @param clazz Entity类
|
||||
* @param pk 主键值
|
||||
*
|
||||
* @return Entity对象
|
||||
*/
|
||||
@Override
|
||||
@@ -1427,6 +1553,7 @@ public final class DataDefaultSource implements DataSource, Function<Class, Enti
|
||||
* @param clazz Entity类
|
||||
* @param flipper 翻页对象
|
||||
* @param bean 过滤Bean
|
||||
*
|
||||
* @return 字段集合
|
||||
*/
|
||||
@Override
|
||||
@@ -1480,6 +1607,7 @@ public final class DataDefaultSource implements DataSource, Function<Class, Enti
|
||||
* @param clazz Entity类
|
||||
* @param column 过滤字段名
|
||||
* @param key 过滤字段值
|
||||
*
|
||||
* @return Entity对象的集合
|
||||
*/
|
||||
@Override
|
||||
@@ -1499,6 +1627,7 @@ public final class DataDefaultSource implements DataSource, Function<Class, Enti
|
||||
* @param <T> Entity类的泛型
|
||||
* @param clazz Entity类
|
||||
* @param bean 过滤Bean
|
||||
*
|
||||
* @return Entity对象集合
|
||||
*/
|
||||
@Override
|
||||
@@ -1531,6 +1660,7 @@ public final class DataDefaultSource implements DataSource, Function<Class, Enti
|
||||
* @param clazz Entity类
|
||||
* @param selects 收集的字段
|
||||
* @param bean 过滤Bean
|
||||
*
|
||||
* @return Entity对象的集合
|
||||
*/
|
||||
@Override
|
||||
@@ -1621,6 +1751,7 @@ public final class DataDefaultSource implements DataSource, Function<Class, Enti
|
||||
* @param clazz Entity类
|
||||
* @param flipper 翻页对象
|
||||
* @param bean 过滤Bean
|
||||
*
|
||||
* @return Entity对象的集合
|
||||
*/
|
||||
@Override
|
||||
@@ -1654,6 +1785,7 @@ public final class DataDefaultSource implements DataSource, Function<Class, Enti
|
||||
* @param selects 收集的字段集合
|
||||
* @param flipper 翻页对象
|
||||
* @param bean 过滤Bean
|
||||
*
|
||||
* @return Entity对象的集合
|
||||
*/
|
||||
@Override
|
||||
|
||||
@@ -73,6 +73,8 @@ public interface DataSource {
|
||||
|
||||
public <T> void updateColumn(final Class<T> clazz, final Serializable id, final String column, final Serializable value);
|
||||
|
||||
public <T> void updateColumn(final Class<T> clazz, final String column, final Serializable value, final FilterNode node);
|
||||
|
||||
public <T> void updateColumnIncrement(final Class<T> clazz, final Serializable id, final String column, long incvalue);
|
||||
|
||||
public <T> void updateColumnAnd(final Class<T> clazz, final Serializable id, final String column, long incvalue);
|
||||
@@ -81,11 +83,15 @@ public interface DataSource {
|
||||
|
||||
public <T> void updateColumns(final T value, final String... columns);
|
||||
|
||||
public <T> void updateColumns(final T value, final FilterNode node, final String... columns);
|
||||
|
||||
//----------------------异步版---------------------------------
|
||||
public <T> void update(final CompletionHandler<Void, T[]> handler, final T... values);
|
||||
|
||||
public <T> void updateColumn(final CompletionHandler<Void, Serializable> handler, final Class<T> clazz, final Serializable id, final String column, final Serializable value);
|
||||
|
||||
public <T> void updateColumn(final CompletionHandler<Void, FilterNode> handler, final Class<T> clazz, final String column, final Serializable value, final FilterNode node);
|
||||
|
||||
public <T> void updateColumnIncrement(final CompletionHandler<Void, Serializable> handler, final Class<T> clazz, final Serializable id, final String column, long incvalue);
|
||||
|
||||
public <T> void updateColumnAnd(final CompletionHandler<Void, Serializable> handler, final Class<T> clazz, final Serializable id, final String column, long incvalue);
|
||||
@@ -94,8 +100,8 @@ public interface DataSource {
|
||||
|
||||
public <T> void updateColumns(final CompletionHandler<Void, T> handler, final T value, final String... columns);
|
||||
|
||||
|
||||
|
||||
public <T> void updateColumns(final CompletionHandler<Void, FilterNode> handler, final T value, final FilterNode node, final String... columns);
|
||||
|
||||
//############################################# 查询接口 #############################################
|
||||
//-----------------------getXXXXResult-----------------------------
|
||||
public Number getNumberResult(final Class entityClass, final FilterFunc func, final String column);
|
||||
@@ -130,6 +136,7 @@ public interface DataSource {
|
||||
* @param <T> 泛型
|
||||
* @param clazz Entity类
|
||||
* @param pk 主键值
|
||||
*
|
||||
* @return Entity对象
|
||||
*/
|
||||
public <T> T find(final Class<T> clazz, final Serializable pk);
|
||||
@@ -183,6 +190,7 @@ public interface DataSource {
|
||||
* @param clazz Entity类
|
||||
* @param column 过滤字段名
|
||||
* @param key 过滤字段值
|
||||
*
|
||||
* @return 字段值的集合
|
||||
*/
|
||||
public <T, V extends Serializable> HashSet<V> queryColumnSet(final String selectedColumn, final Class<T> clazz, final String column, final Serializable key);
|
||||
@@ -219,6 +227,7 @@ public interface DataSource {
|
||||
* @param clazz Entity类
|
||||
* @param flipper 翻页对象
|
||||
* @param bean 过滤Bean
|
||||
*
|
||||
* @return 结果集合
|
||||
*/
|
||||
public <T, V extends Serializable> Sheet<V> queryColumnSheet(final String selectedColumn, final Class<T> clazz, final Flipper flipper, final FilterBean bean);
|
||||
@@ -237,6 +246,7 @@ public interface DataSource {
|
||||
* @param clazz Entity类
|
||||
* @param column 过滤字段名
|
||||
* @param key 过滤字段值
|
||||
*
|
||||
* @return Entity的List
|
||||
*/
|
||||
public <T> List<T> queryList(final Class<T> clazz, final String column, final Serializable key);
|
||||
@@ -288,6 +298,7 @@ public interface DataSource {
|
||||
* @param clazz Entity类
|
||||
* @param flipper 翻页对象
|
||||
* @param bean 过滤Bean
|
||||
*
|
||||
* @return Entity的Sheet
|
||||
*/
|
||||
public <T> Sheet<T> querySheet(final Class<T> clazz, final Flipper flipper, final FilterBean bean);
|
||||
@@ -322,6 +333,7 @@ public interface DataSource {
|
||||
* 通常用于复杂的更新操作
|
||||
*
|
||||
* @param sqls SQL语句
|
||||
*
|
||||
* @return 结果数组
|
||||
*/
|
||||
public int[] directExecute(String... sqls);
|
||||
|
||||
@@ -400,6 +400,15 @@ public final class EntityCache<T> {
|
||||
return rs;
|
||||
}
|
||||
|
||||
public <V> T[] update(Attribute<T, V> attr, final V fieldValue, final FilterNode node) {
|
||||
if (attr == null || node == null) return (T[]) Array.newInstance(type, 0);
|
||||
T[] rms = this.list.stream().filter(node.createPredicate(this)).toArray(len -> (T[]) Array.newInstance(type, len));
|
||||
for (T rs : rms) {
|
||||
attr.set(rs, fieldValue);
|
||||
}
|
||||
return rms;
|
||||
}
|
||||
|
||||
public <V> T updateColumnOr(final Serializable id, Attribute<T, V> attr, final long orvalue) {
|
||||
if (id == null) return null;
|
||||
T rs = this.map.get(id);
|
||||
|
||||
Reference in New Issue
Block a user