DataSource增加queryMap系列方法

This commit is contained in:
Redkale
2017-10-26 13:20:05 +08:00
parent 734b1bbbb4
commit 53b11116b9
3 changed files with 121 additions and 9 deletions

View File

@@ -13,6 +13,7 @@ import java.util.concurrent.CompletableFuture;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.*; import java.util.function.*;
import java.util.logging.*; import java.util.logging.*;
import java.util.stream.Stream;
import javax.annotation.Resource; import javax.annotation.Resource;
import org.redkale.service.*; import org.redkale.service.*;
import static org.redkale.source.DataSources.*; import static org.redkale.source.DataSources.*;
@@ -1893,6 +1894,60 @@ public class DataJdbcSource extends AbstractService implements DataSource, DataC
return rs; return rs;
} }
/**
* 查询符合过滤条件记录的Map集合, 主键值为key <br>
* 等价SQL: SELECT * FROM {table} WHERE {column} = {key} ORDER BY {flipper.sort} LIMIT {flipper.limit} <br>
*
* @param <K> 主键泛型
* @param <T> Entity泛型
* @param clazz Entity类
* @param keyStream 主键Stream
*
* @return Entity的集合
*/
@Override
public <K extends Serializable, T> Map<K, T> queryMap(final Class<T> clazz, final Stream<K> keyStream) {
return queryMap(clazz, null, keyStream);
}
@Override
public <K extends Serializable, T> CompletableFuture<Map<K, T>> queryMapAsync(final Class<T> clazz, final Stream<K> keyStream) {
return CompletableFuture.supplyAsync(() -> queryMap(clazz, null, keyStream), getExecutor());
}
/**
* 查询符合过滤条件记录的Map集合, 主键值为key <br>
* 等价SQL: SELECT * FROM {table} WHERE {column} = {key} ORDER BY {flipper.sort} LIMIT {flipper.limit} <br>
*
* @param <K> 主键泛型
* @param <T> Entity泛型
* @param clazz Entity类
* @param selects 指定字段
* @param keyStream 主键Stream
*
* @return Entity的集合
*/
@Override
public <K extends Serializable, T> Map<K, T> queryMap(final Class<T> clazz, final SelectColumn selects, final Stream<K> keyStream) {
if (keyStream == null) return new LinkedHashMap<>();
final EntityInfo<T> info = loadEntityInfo(clazz);
final ArrayList<K> ids = new ArrayList<>();
keyStream.forEach(k -> ids.add(k));
final Attribute<T, Serializable> primary = info.primary;
List<T> rs = queryList(clazz, FilterNode.create(primary.field(), ids));
Map<K, T> map = new LinkedHashMap<>();
if (rs.isEmpty()) return new LinkedHashMap<>();
for (T item : rs) {
map.put((K) primary.get(item), item);
}
return map;
}
@Override
public <K extends Serializable, T> CompletableFuture<Map<K, T>> queryMapAsync(final Class<T> clazz, final SelectColumn selects, final Stream<K> keyStream) {
return CompletableFuture.supplyAsync(() -> queryMap(clazz, selects, keyStream), getExecutor());
}
/** /**
* 根据指定字段值查询对象集合 * 根据指定字段值查询对象集合
* *

View File

@@ -8,6 +8,7 @@ package org.redkale.source;
import java.io.Serializable; import java.io.Serializable;
import java.util.*; import java.util.*;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
import java.util.stream.Stream;
import org.redkale.util.*; import org.redkale.util.*;
/** /**
@@ -1492,6 +1493,60 @@ public interface DataSource {
*/ */
public <T, V extends Serializable> CompletableFuture<Sheet<V>> queryColumnSheetAsync(final String selectedColumn, final Class<T> clazz, final Flipper flipper, final FilterNode node); public <T, V extends Serializable> CompletableFuture<Sheet<V>> queryColumnSheetAsync(final String selectedColumn, final Class<T> clazz, final Flipper flipper, final FilterNode node);
/**
* 查询符合过滤条件记录的Map集合, 主键值为key <br>
* 等价SQL: SELECT * FROM {table} WHERE {column} = {key} ORDER BY {flipper.sort} LIMIT {flipper.limit} <br>
*
* @param <K> 主键泛型
* @param <T> Entity泛型
* @param clazz Entity类
* @param keyStream 主键Stream
*
* @return Entity的集合
*/
public <K extends Serializable, T> Map<K, T> queryMap(final Class<T> clazz, final Stream<K> keyStream);
/**
* 查询符合过滤条件记录的List集合 <br>
* 等价SQL: SELECT * FROM {table} WHERE {column} = {key} ORDER BY {flipper.sort} LIMIT {flipper.limit} <br>
*
* @param <K> 主键泛型
* @param <T> Entity泛型
* @param clazz Entity类
* @param keyStream 主键Stream
*
* @return Entity的集合CompletableFuture
*/
public <K extends Serializable, T> CompletableFuture<Map<K, T>> queryMapAsync(final Class<T> clazz, final Stream<K> keyStream);
/**
* 查询符合过滤条件记录的Map集合, 主键值为key <br>
* 等价SQL: SELECT * FROM {table} WHERE {column} = {key} ORDER BY {flipper.sort} LIMIT {flipper.limit} <br>
*
* @param <K> 主键泛型
* @param <T> Entity泛型
* @param clazz Entity类
* @param selects 指定字段
* @param keyStream 主键Stream
*
* @return Entity的集合
*/
public <K extends Serializable, T> Map<K, T> queryMap(final Class<T> clazz, final SelectColumn selects, final Stream<K> keyStream);
/**
* 查询符合过滤条件记录的List集合 <br>
* 等价SQL: SELECT * FROM {table} WHERE {column} = {key} ORDER BY {flipper.sort} LIMIT {flipper.limit} <br>
*
* @param <K> 主键泛型
* @param <T> Entity泛型
* @param clazz Entity类
* @param selects 指定字段
* @param keyStream 主键Stream
*
* @return Entity的集合CompletableFuture
*/
public <K extends Serializable, T> CompletableFuture<Map<K, T>> queryMapAsync(final Class<T> clazz, final SelectColumn selects, final Stream<K> keyStream);
/** /**
* 查询符合过滤条件记录的List集合 <br> * 查询符合过滤条件记录的List集合 <br>
* 等价SQL: SELECT * FROM {table} WHERE {column} = {key} ORDER BY {flipper.sort} LIMIT {flipper.limit} <br> * 等价SQL: SELECT * FROM {table} WHERE {column} = {key} ORDER BY {flipper.sort} LIMIT {flipper.limit} <br>

View File

@@ -55,9 +55,11 @@ public class FilterNode { //FilterNode 不能实现Serializable接口 否则
} }
if (subval instanceof Range) { if (subval instanceof Range) {
exp = FilterExpress.BETWEEN; exp = FilterExpress.BETWEEN;
} else if (subval instanceof Collection) { // } else if (subval instanceof Collection) {
exp = FilterExpress.IN; // exp = FilterExpress.IN;
} else if (subval != null && val.getClass().isArray()) { // } else if (subval != null && val.getClass().isArray()) {
// exp = FilterExpress.IN;
} else {
exp = FilterExpress.IN; exp = FilterExpress.IN;
} }
} else { //空集合 } else { //空集合
@@ -280,7 +282,7 @@ public class FilterNode { //FilterNode 不能实现Serializable接口 否则
} }
private static boolean needSplit(final FilterExpress express, final Object val0) { private static boolean needSplit(final FilterExpress express, final Object val0) {
if(val0 == null) return false; if (val0 == null) return false;
boolean items = express != IN && express != NOTIN; //是否数组集合的表达式 boolean items = express != IN && express != NOTIN; //是否数组集合的表达式
if (!items) { if (!items) {
if (val0.getClass().isArray()) { if (val0.getClass().isArray()) {