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);
|
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
|
@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) {
|
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);
|
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));
|
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
|
@Override
|
||||||
public Number getNumberResult(final Class entityClass, final FilterFunc func, final Number defVal, final String column, final FilterNode node) {
|
public Number getNumberResult(final Class entityClass, final FilterFunc func, final Number defVal, final String column, final FilterNode node) {
|
||||||
final EntityInfo info = loadEntityInfo(entityClass);
|
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 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);
|
||||||
|
|
||||||
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);
|
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