This commit is contained in:
@@ -417,7 +417,7 @@ public final class DataJDBCSource implements DataSource {
|
|||||||
for (final Class t : info.distributeTables) {
|
for (final Class t : info.distributeTables) {
|
||||||
EntityInfo<T> infox = loadEntityInfo(t);
|
EntityInfo<T> infox = loadEntityInfo(t);
|
||||||
stmt = conn.createStatement();
|
stmt = conn.createStatement();
|
||||||
rs = stmt.executeQuery("SELECT MAX(" + info.getPrimarySQLColumn() + ") FROM " + infox.getTable());// 必须是同一字段名
|
rs = stmt.executeQuery("SELECT MAX(" + info.getPrimarySQLColumn() + ") FROM " + infox.getTable()); // 必须是同一字段名
|
||||||
if (rs.next()) {
|
if (rs.next()) {
|
||||||
if (primaryType == int.class) {
|
if (primaryType == int.class) {
|
||||||
int v = rs.getInt(1) / info.allocationSize;
|
int v = rs.getInt(1) / info.allocationSize;
|
||||||
|
|||||||
@@ -39,13 +39,6 @@ public interface DataSource {
|
|||||||
*/
|
*/
|
||||||
public <T> void insert(T... values);
|
public <T> void insert(T... values);
|
||||||
|
|
||||||
/**
|
|
||||||
* 新增对象, 必须是Entity对象
|
|
||||||
*
|
|
||||||
* @param <T>
|
|
||||||
* @param conn
|
|
||||||
* @param values
|
|
||||||
*/
|
|
||||||
public <T> void insert(final DataConnection conn, T... values);
|
public <T> void insert(final DataConnection conn, T... values);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -65,51 +58,14 @@ public interface DataSource {
|
|||||||
*/
|
*/
|
||||||
public <T> void delete(T... values);
|
public <T> void delete(T... values);
|
||||||
|
|
||||||
/**
|
|
||||||
* 删除对象, 必须是Entity对象
|
|
||||||
*
|
|
||||||
* @param <T>
|
|
||||||
* @param conn
|
|
||||||
* @param values
|
|
||||||
*/
|
|
||||||
public <T> void delete(final DataConnection conn, T... values);
|
public <T> void delete(final DataConnection conn, T... values);
|
||||||
|
|
||||||
/**
|
|
||||||
* 根据主键值删除对象, 必须是Entity Class
|
|
||||||
*
|
|
||||||
* @param <T>
|
|
||||||
* @param clazz
|
|
||||||
* @param ids 主键值
|
|
||||||
*/
|
|
||||||
public <T> void delete(Class<T> clazz, Serializable... ids);
|
public <T> void delete(Class<T> clazz, Serializable... ids);
|
||||||
|
|
||||||
/**
|
|
||||||
* 根据主键值删除对象, 必须是Entity Class
|
|
||||||
*
|
|
||||||
* @param <T>
|
|
||||||
* @param conn
|
|
||||||
* @param clazz
|
|
||||||
* @param ids
|
|
||||||
*/
|
|
||||||
public <T> void delete(final DataConnection conn, Class<T> clazz, Serializable... ids);
|
public <T> void delete(final DataConnection conn, Class<T> clazz, Serializable... ids);
|
||||||
|
|
||||||
/**
|
|
||||||
* 根据FilterNode的值删除对象, 必须是Entity Class
|
|
||||||
*
|
|
||||||
* @param <T>
|
|
||||||
* @param clazz
|
|
||||||
* @param node
|
|
||||||
*/
|
|
||||||
public <T> void delete(Class<T> clazz, FilterNode node);
|
public <T> void delete(Class<T> clazz, FilterNode node);
|
||||||
|
|
||||||
/**
|
|
||||||
* 根据FilterNode的值删除对象, 必须是Entity Class
|
|
||||||
*
|
|
||||||
* @param <T>
|
|
||||||
* @param conn
|
|
||||||
* @param clazz
|
|
||||||
* @param node
|
|
||||||
*/
|
|
||||||
public <T> void delete(final DataConnection conn, Class<T> clazz, FilterNode node);
|
public <T> void delete(final DataConnection conn, Class<T> clazz, FilterNode node);
|
||||||
|
|
||||||
//------------------------update---------------------------
|
//------------------------update---------------------------
|
||||||
@@ -123,43 +79,18 @@ public interface DataSource {
|
|||||||
|
|
||||||
public <T> void update(final DataConnection conn, T... values);
|
public <T> void update(final DataConnection conn, T... values);
|
||||||
|
|
||||||
/**
|
|
||||||
* 根据主键值更新对象的column对应的值, 必须是Entity Class
|
|
||||||
*
|
|
||||||
* @param <T>
|
|
||||||
* @param clazz
|
|
||||||
* @param id
|
|
||||||
* @param column
|
|
||||||
* @param value
|
|
||||||
*/
|
|
||||||
public <T> void updateColumn(Class<T> clazz, Serializable id, String column, Serializable value);
|
public <T> void updateColumn(Class<T> clazz, Serializable id, String column, Serializable value);
|
||||||
|
|
||||||
public <T> void updateColumn(DataConnection conn, Class<T> clazz, Serializable id, String column, Serializable value);
|
public <T> void updateColumn(DataConnection conn, Class<T> clazz, Serializable id, String column, Serializable value);
|
||||||
|
|
||||||
/**
|
|
||||||
* 根据主键值给对象的column对应的值+incvalue, 必须是Entity Class
|
|
||||||
*
|
|
||||||
* @param <T>
|
|
||||||
* @param clazz
|
|
||||||
* @param id
|
|
||||||
* @param column
|
|
||||||
* @param incvalue
|
|
||||||
*/
|
|
||||||
public <T> void updateColumnIncrement(Class<T> clazz, Serializable id, String column, long incvalue);
|
|
||||||
|
|
||||||
public <T> void updateColumnIncrement(final DataConnection conn, Class<T> clazz, Serializable id, String column, long incvalue);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 更新对象指定的一些字段, 必须是Entity对象
|
|
||||||
*
|
|
||||||
* @param <T>
|
|
||||||
* @param value
|
|
||||||
* @param columns
|
|
||||||
*/
|
|
||||||
public <T> void updateColumns(final T value, final String... columns);
|
public <T> void updateColumns(final T value, final String... columns);
|
||||||
|
|
||||||
public <T> void updateColumns(final DataConnection conn, final T value, final String... columns);
|
public <T> void updateColumns(final DataConnection conn, final T value, final String... columns);
|
||||||
|
|
||||||
|
public <T> void updateColumnIncrement(Class<T> clazz, Serializable id, String column, long incvalue);
|
||||||
|
|
||||||
|
public <T> void updateColumnIncrement(final DataConnection conn, Class<T> clazz, Serializable id, String column, long incvalue);
|
||||||
|
|
||||||
//-----------------------getSingleResult-----------------------------
|
//-----------------------getSingleResult-----------------------------
|
||||||
//-----------------------------MAX-----------------------------
|
//-----------------------------MAX-----------------------------
|
||||||
public Number getMaxSingleResult(final Class entityClass, final String column);
|
public Number getMaxSingleResult(final Class entityClass, final String column);
|
||||||
@@ -189,6 +120,7 @@ public interface DataSource {
|
|||||||
|
|
||||||
public Number getCountSingleResult(final Class entityClass, FilterNode node);
|
public Number getCountSingleResult(final Class entityClass, FilterNode node);
|
||||||
|
|
||||||
|
//----------------------------DISTINCT COUNT----------------------------
|
||||||
public Number getCountDistinctSingleResult(final Class entityClass, String column);
|
public Number getCountDistinctSingleResult(final Class entityClass, String column);
|
||||||
|
|
||||||
public Number getCountDistinctSingleResult(final Class entityClass, String column, FilterBean bean);
|
public Number getCountDistinctSingleResult(final Class entityClass, String column, FilterBean bean);
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ final class EntityCache<T> {
|
|||||||
private boolean fullloaded;
|
private boolean fullloaded;
|
||||||
|
|
||||||
public EntityCache(final Class<T> type, Creator<T> creator, Attribute<T, Serializable> primary,
|
public EntityCache(final Class<T> type, Creator<T> creator, Attribute<T, Serializable> primary,
|
||||||
Map<String, Attribute<T, Serializable>> attributes) {
|
Map<String, Attribute<T, Serializable>> attributes) {
|
||||||
this.type = type;
|
this.type = type;
|
||||||
this.creator = creator;
|
this.creator = creator;
|
||||||
this.primary = primary;
|
this.primary = primary;
|
||||||
@@ -58,7 +58,7 @@ final class EntityCache<T> {
|
|||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public void fullLoad(List<T> all) {
|
public void fullLoad(List<T> all) {
|
||||||
@@ -95,6 +95,10 @@ final class EntityCache<T> {
|
|||||||
return rs.isPresent() ? (needcopy ? reproduce.copy(this.creator.create(), rs.get()) : rs.get()) : null;
|
return rs.isPresent() ? (needcopy ? reproduce.copy(this.creator.create(), rs.get()) : rs.get()) : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean contains(final Predicate<T> filter) {
|
||||||
|
return (filter != null) && listStream().filter(filter).findFirst().isPresent();
|
||||||
|
}
|
||||||
|
|
||||||
public <V> Number getSingleResult(final ReckonType type, final Attribute<T, V> attr, final Predicate<T> filter) {
|
public <V> Number getSingleResult(final ReckonType type, final Attribute<T, V> attr, final Predicate<T> filter) {
|
||||||
Stream<T> stream = listStream();
|
Stream<T> stream = listStream();
|
||||||
if (filter != null) stream = stream.filter(filter);
|
if (filter != null) stream = stream.filter(filter);
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import java.io.Serializable;
|
|||||||
import java.lang.reflect.*;
|
import java.lang.reflect.*;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.function.Function;
|
import java.util.function.*;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
import javax.persistence.Transient;
|
import javax.persistence.Transient;
|
||||||
|
|
||||||
@@ -89,9 +89,9 @@ final class FilterBeanNode extends FilterNode {
|
|||||||
}
|
}
|
||||||
newnode.foreignEntity = secinfo;
|
newnode.foreignEntity = secinfo;
|
||||||
newnode.tabalis = alias;
|
newnode.tabalis = alias;
|
||||||
|
newnode.columnAttribute = secinfo.getAttribute(newnode.column);
|
||||||
newnode.foreignAttribute = joinCol.column().isEmpty() ? secinfo.getPrimary() : secinfo.getAttribute(joinCol.column());
|
newnode.foreignAttribute = joinCol.column().isEmpty() ? secinfo.getPrimary() : secinfo.getAttribute(joinCol.column());
|
||||||
if (newnode.foreignEntity != null && newnode.foreignAttribute == null) throw new RuntimeException(clazz.getName() + "." + field.getName() + " have illegal FilterJoinColumn " + joinCol);
|
if (newnode.foreignEntity != null && newnode.foreignAttribute == null) throw new RuntimeException(clazz.getName() + "." + field.getName() + " have illegal FilterJoinColumn " + joinCol);
|
||||||
joinallcached = false; //关联查询暂不支持缓存查询
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//------------------------------------
|
//------------------------------------
|
||||||
@@ -143,6 +143,8 @@ final class FilterBeanNode extends FilterNode {
|
|||||||
|
|
||||||
private Attribute foreignAttribute;
|
private Attribute foreignAttribute;
|
||||||
|
|
||||||
|
private Attribute columnAttribute;
|
||||||
|
|
||||||
private boolean array;
|
private boolean array;
|
||||||
|
|
||||||
private boolean collection;
|
private boolean collection;
|
||||||
@@ -197,6 +199,7 @@ final class FilterBeanNode extends FilterNode {
|
|||||||
newnode.nodes = this.nodes;
|
newnode.nodes = this.nodes;
|
||||||
newnode.foreignEntity = this.foreignEntity;
|
newnode.foreignEntity = this.foreignEntity;
|
||||||
newnode.foreignAttribute = this.foreignAttribute;
|
newnode.foreignAttribute = this.foreignAttribute;
|
||||||
|
newnode.columnAttribute = this.columnAttribute;
|
||||||
newnode.array = this.array;
|
newnode.array = this.array;
|
||||||
newnode.collection = this.collection;
|
newnode.collection = this.collection;
|
||||||
newnode.ignoreCase = this.ignoreCase;
|
newnode.ignoreCase = this.ignoreCase;
|
||||||
@@ -214,6 +217,7 @@ final class FilterBeanNode extends FilterNode {
|
|||||||
this.beanAttribute = beanNode.beanAttribute;
|
this.beanAttribute = beanNode.beanAttribute;
|
||||||
this.foreignEntity = beanNode.foreignEntity;
|
this.foreignEntity = beanNode.foreignEntity;
|
||||||
this.foreignAttribute = beanNode.foreignAttribute;
|
this.foreignAttribute = beanNode.foreignAttribute;
|
||||||
|
this.columnAttribute = beanNode.columnAttribute;
|
||||||
this.array = beanNode.array;
|
this.array = beanNode.array;
|
||||||
this.collection = beanNode.collection;
|
this.collection = beanNode.collection;
|
||||||
this.ignoreCase = beanNode.ignoreCase;
|
this.ignoreCase = beanNode.ignoreCase;
|
||||||
@@ -232,9 +236,56 @@ final class FilterBeanNode extends FilterNode {
|
|||||||
return new StringBuilder(sb.length() + jsql.length()).append(jsql).append(sb);
|
return new StringBuilder(sb.length() + jsql.length()).append(jsql).append(sb);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected <T> Predicate<T> createFilterPredicate(final EntityInfo<T> info, FilterBean bean) {
|
||||||
|
if (this.foreignEntity == null) return super.createFilterPredicate(info, bean);
|
||||||
|
final Map<EntityInfo, Predicate> foreign = new HashMap<>();
|
||||||
|
Predicate<T> result = null;
|
||||||
|
putForeignPredicate(foreign, bean);
|
||||||
|
if (this.nodes != null) {
|
||||||
|
for (FilterNode n : this.nodes) {
|
||||||
|
FilterBeanNode node = (FilterBeanNode) n;
|
||||||
|
if (node.foreignEntity == null) {
|
||||||
|
Predicate<T> f = node.createFilterPredicate(info, bean);
|
||||||
|
if (f == null) continue;
|
||||||
|
result = (result == null) ? f : (signand ? result.and(f) : result.or(f));
|
||||||
|
} else {
|
||||||
|
putForeignPredicate(foreign, bean);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final Attribute foreignAttr = this.foreignAttribute;
|
||||||
|
for (Map.Entry<EntityInfo, Predicate> en : foreign.entrySet()) {
|
||||||
|
Attribute<T, Serializable> mainIdAttr = info.getPrimary();
|
||||||
|
final EntityCache cache = en.getKey().getCache();
|
||||||
|
final Predicate p = en.getValue();
|
||||||
|
Predicate<T> f = (T t) -> {
|
||||||
|
Serializable key = mainIdAttr.get(t);
|
||||||
|
Predicate k = (e) -> key.equals(foreignAttr.get(e));
|
||||||
|
return cache.contains(k.and(p));
|
||||||
|
};
|
||||||
|
result = (result == null) ? f : (signand ? result.and(f) : result.or(f));
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void putForeignPredicate(final Map<EntityInfo, Predicate> foreign, FilterBean bean) {
|
||||||
|
final Serializable val = getValue(bean);
|
||||||
|
Predicate filter = (val == null && express != ISNULL && express != ISNOTNULL) ? ((t) -> signand) : super.createFilterPredicate(this.columnAttribute, val);
|
||||||
|
if (filter == null) return;
|
||||||
|
Predicate p = foreign.get(this.foreignEntity);
|
||||||
|
if (p == null) {
|
||||||
|
foreign.put(foreignEntity, filter);
|
||||||
|
} else if (signand) {
|
||||||
|
p.and(filter);
|
||||||
|
} else {
|
||||||
|
p.or(filter);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected boolean isJoinAllCached() {
|
protected boolean isJoinAllCached() {
|
||||||
return joinallcached; //暂时没实现
|
return joinallcached;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -201,7 +201,7 @@ public class FilterNode {
|
|||||||
return sb;
|
return sb;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected final <T> Predicate<T> createFilterPredicate(final EntityInfo<T> info, FilterBean bean) {
|
protected <T> Predicate<T> createFilterPredicate(final EntityInfo<T> info, FilterBean bean) {
|
||||||
if (info == null) return null;
|
if (info == null) return null;
|
||||||
final Serializable val = getValue(bean);
|
final Serializable val = getValue(bean);
|
||||||
if (val == null && express != ISNULL && express != ISNOTNULL) return null;
|
if (val == null && express != ISNULL && express != ISNOTNULL) return null;
|
||||||
@@ -215,7 +215,7 @@ public class FilterNode {
|
|||||||
return filter;
|
return filter;
|
||||||
}
|
}
|
||||||
|
|
||||||
private <T> Predicate<T> createFilterPredicate(final Attribute<T, Serializable> attr, final Serializable val) {
|
protected final <T> Predicate<T> createFilterPredicate(final Attribute<T, Serializable> attr, final Serializable val) {
|
||||||
if (attr == null) return null;
|
if (attr == null) return null;
|
||||||
switch (express) {
|
switch (express) {
|
||||||
case EQUAL: return (T t) -> val.equals(attr.get(t));
|
case EQUAL: return (T t) -> val.equals(attr.get(t));
|
||||||
|
|||||||
Reference in New Issue
Block a user