DataSource增加getNumberMap方法,用于查询多个字段的统计值
This commit is contained in:
@@ -133,6 +133,21 @@ public class DataSourceService implements DataSource, Service, AutoCloseable {
|
||||
return source.getNumberResult(entityClass, func, defVal, column, node);
|
||||
}
|
||||
|
||||
@Override
|
||||
public <N extends Number> Map<String, N> getNumberMap(final Class entityClass, final FilterFuncColumn... columns) {
|
||||
return source.getNumberMap(entityClass, columns);
|
||||
}
|
||||
|
||||
@Override
|
||||
public <N extends Number> Map<String, N> getNumberMap(final Class entityClass, final FilterBean bean, final FilterFuncColumn... columns) {
|
||||
return source.getNumberMap(entityClass, bean, columns);
|
||||
}
|
||||
|
||||
@Override
|
||||
public <N extends Number> Map<String, N> getNumberMap(final Class entityClass, final FilterNode node, final FilterFuncColumn... columns) {
|
||||
return source.getNumberMap(entityClass, node, columns);
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T, K extends Serializable, N extends Number> Map<K, N> queryColumnMap(final Class<T> entityClass, final String keyColumn, FilterFunc func, final String funcColumn) {
|
||||
return source.queryColumnMap(entityClass, keyColumn, func, funcColumn);
|
||||
|
||||
@@ -1141,6 +1141,71 @@ public final class DataDefaultSource implements DataSource, Function<Class, Enti
|
||||
return getNumberResult(entityClass, func, defVal, column, FilterNodeBean.createFilterNode(bean));
|
||||
}
|
||||
|
||||
@Override
|
||||
public <N extends Number> Map<String, N> getNumberMap(final Class entityClass, final FilterFuncColumn... columns) {
|
||||
return getNumberMap(entityClass, (FilterNode) null, columns);
|
||||
}
|
||||
|
||||
@Override
|
||||
public <N extends Number> Map<String, N> getNumberMap(final Class entityClass, final FilterBean bean, final FilterFuncColumn... columns) {
|
||||
return getNumberMap(entityClass, FilterNodeBean.createFilterNode(bean), columns);
|
||||
}
|
||||
|
||||
@Override
|
||||
public <N extends Number> Map<String, N> getNumberMap(final Class entityClass, final FilterNode node, final FilterFuncColumn... columns) {
|
||||
if (columns == null || columns.length == 0) return new HashMap<>();
|
||||
final EntityInfo info = loadEntityInfo(entityClass);
|
||||
final Connection conn = createReadSQLConnection();
|
||||
final Map map = new HashMap<>();
|
||||
try {
|
||||
final EntityCache cache = info.getCache();
|
||||
if (cache != null && (info.isVirtualEntity() || cache.isFullLoaded())) {
|
||||
if (node == null || node.isCacheUseable(this)) {
|
||||
for (FilterFuncColumn ffc : columns) {
|
||||
map.put(ffc.col(), cache.getNumberResult(ffc.func, ffc.defvalue, ffc.column, node));
|
||||
}
|
||||
return map;
|
||||
}
|
||||
}
|
||||
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);
|
||||
StringBuilder sb = new StringBuilder();
|
||||
for (FilterFuncColumn ffc : columns) {
|
||||
if (sb.length() > 0) sb.append(", ");
|
||||
sb.append(ffc.func.getColumn((ffc.column == null || ffc.column.isEmpty() ? "*" : ("a." + ffc.column))));
|
||||
}
|
||||
final String sql = "SELECT " + sb + " FROM " + info.getTable(node) + " a"
|
||||
+ (join == null ? "" : join) + ((where == null || where.length() == 0) ? "" : (" WHERE " + where));
|
||||
if (debug.get() && info.isLoggable(Level.FINEST)) logger.finest(entityClass.getSimpleName() + " single sql=" + sql);
|
||||
final PreparedStatement prestmt = conn.prepareStatement(sql);
|
||||
|
||||
ResultSet set = prestmt.executeQuery();
|
||||
if (set.next()) {
|
||||
int index = 0;
|
||||
for (FilterFuncColumn ffc : columns) {
|
||||
Object o = set.getObject(++index);
|
||||
Number rs = ffc.defvalue;
|
||||
if (o != null) rs = (Number) o;
|
||||
map.put(ffc.col(), rs);
|
||||
}
|
||||
}
|
||||
set.close();
|
||||
prestmt.close();
|
||||
return map;
|
||||
} catch (SQLException e) {
|
||||
if (info.tableStrategy != null && info.tablenotexistSqlstates.contains(';' + e.getSQLState() + ';')) {
|
||||
for (FilterFuncColumn ffc : columns) {
|
||||
map.put(ffc.col(), ffc.defvalue);
|
||||
}
|
||||
return map;
|
||||
}
|
||||
throw new RuntimeException(e);
|
||||
} finally {
|
||||
if (conn != null) closeSQLConnection(conn);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Number getNumberResult(final Class entityClass, final FilterFunc func, final Number defVal, final String column, final FilterNode node) {
|
||||
final EntityInfo info = loadEntityInfo(entityClass);
|
||||
|
||||
@@ -125,6 +125,12 @@ public interface DataSource {
|
||||
|
||||
public Number getNumberResult(final Class entityClass, final FilterFunc func, final Number defVal, final String column, final FilterNode node);
|
||||
|
||||
public <N extends Number> Map<String, N> getNumberMap(final Class entityClass, final FilterFuncColumn... columns);
|
||||
|
||||
public <N extends Number> Map<String, N> getNumberMap(final Class entityClass, final FilterBean bean, final FilterFuncColumn... columns);
|
||||
|
||||
public <N extends Number> Map<String, N> getNumberMap(final Class entityClass, final FilterNode node, final FilterFuncColumn... columns);
|
||||
|
||||
public <T, K extends Serializable, N extends Number> Map<K, N> queryColumnMap(final Class<T> entityClass, final String keyColumn, final FilterFunc func, final String funcColumn);
|
||||
|
||||
public <T, K extends Serializable, N extends Number> Map<K, N> queryColumnMap(final Class<T> entityClass, final String keyColumn, final FilterFunc func, final String funcColumn, final FilterBean bean);
|
||||
|
||||
86
src/org/redkale/source/FilterFuncColumn.java
Normal file
86
src/org/redkale/source/FilterFuncColumn.java
Normal file
@@ -0,0 +1,86 @@
|
||||
/*
|
||||
* To change this license header, choose License Headers in Project Properties.
|
||||
* To change this template file, choose Tools | Templates
|
||||
* and open the template in the editor.
|
||||
*/
|
||||
package org.redkale.source;
|
||||
|
||||
import org.redkale.convert.json.JsonConvert;
|
||||
|
||||
/**
|
||||
* FilterFuncColumn用于getNumberMap获取列表似数据, getNumberResult获取单字段值, getNumberMap获取多字段值
|
||||
*
|
||||
* @author zhangjx
|
||||
*/
|
||||
public class FilterFuncColumn implements java.io.Serializable {
|
||||
|
||||
public static final String COLUMN_NULL = "*";
|
||||
|
||||
FilterFunc func;
|
||||
|
||||
String column; //为null,将使用*代替
|
||||
|
||||
Number defvalue;
|
||||
|
||||
public FilterFuncColumn() {
|
||||
}
|
||||
|
||||
public static FilterFuncColumn create(final FilterFunc func) {
|
||||
return new FilterFuncColumn(func);
|
||||
}
|
||||
|
||||
public static FilterFuncColumn create(final FilterFunc func, final String column) {
|
||||
return new FilterFuncColumn(func, column);
|
||||
}
|
||||
|
||||
public static FilterFuncColumn create(final FilterFunc func, final String column, final Number defvalue) {
|
||||
return new FilterFuncColumn(func, column, defvalue);
|
||||
}
|
||||
|
||||
String col() {
|
||||
return column == null || column.isEmpty() ? COLUMN_NULL : column;
|
||||
}
|
||||
|
||||
public FilterFuncColumn(final FilterFunc func) {
|
||||
this(func, null, null);
|
||||
}
|
||||
|
||||
public FilterFuncColumn(final FilterFunc func, final String column) {
|
||||
this(func, column, null);
|
||||
}
|
||||
|
||||
public FilterFuncColumn(final FilterFunc func, final String column, final Number defvalue) {
|
||||
this.func = func;
|
||||
this.column = column;
|
||||
this.defvalue = defvalue;
|
||||
}
|
||||
|
||||
public FilterFunc getFunc() {
|
||||
return func;
|
||||
}
|
||||
|
||||
public void setFunc(FilterFunc func) {
|
||||
this.func = func;
|
||||
}
|
||||
|
||||
public String getColumn() {
|
||||
return column;
|
||||
}
|
||||
|
||||
public void setColumn(String column) {
|
||||
this.column = column;
|
||||
}
|
||||
|
||||
public Number getDefvalue() {
|
||||
return defvalue;
|
||||
}
|
||||
|
||||
public void setDefvalue(Number defvalue) {
|
||||
this.defvalue = defvalue;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return JsonConvert.root().convertTo(this);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user