Entity数据库实体类支持AtomicInteger、AtomicLong字段类型
This commit is contained in:
@@ -10,6 +10,7 @@ import java.net.URL;
|
|||||||
import java.sql.*;
|
import java.sql.*;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.concurrent.CompletableFuture;
|
import java.util.concurrent.CompletableFuture;
|
||||||
|
import java.util.concurrent.atomic.*;
|
||||||
import java.util.function.*;
|
import java.util.function.*;
|
||||||
import java.util.logging.*;
|
import java.util.logging.*;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
@@ -323,6 +324,10 @@ public class DataJdbcSource extends AbstractService implements DataSource, DataC
|
|||||||
Blob blob = conn.createBlob();
|
Blob blob = conn.createBlob();
|
||||||
blob.setBytes(1, (byte[]) val);
|
blob.setBytes(1, (byte[]) val);
|
||||||
prestmt.setObject(++i, blob);
|
prestmt.setObject(++i, blob);
|
||||||
|
} else if (val instanceof AtomicInteger) {
|
||||||
|
prestmt.setObject(++i, ((AtomicInteger) val).get());
|
||||||
|
} else if (val instanceof AtomicLong) {
|
||||||
|
prestmt.setObject(++i, ((AtomicLong) val).get());
|
||||||
} else {
|
} else {
|
||||||
prestmt.setObject(++i, val);
|
prestmt.setObject(++i, val);
|
||||||
}
|
}
|
||||||
@@ -599,6 +604,10 @@ public class DataJdbcSource extends AbstractService implements DataSource, DataC
|
|||||||
Blob blob = conn.createBlob();
|
Blob blob = conn.createBlob();
|
||||||
blob.setBytes(1, (byte[]) val);
|
blob.setBytes(1, (byte[]) val);
|
||||||
prestmt.setObject(++k, blob);
|
prestmt.setObject(++k, blob);
|
||||||
|
} else if (val instanceof AtomicInteger) {
|
||||||
|
prestmt.setObject(++k, ((AtomicInteger) val).get());
|
||||||
|
} else if (val instanceof AtomicLong) {
|
||||||
|
prestmt.setObject(++k, ((AtomicLong) val).get());
|
||||||
} else {
|
} else {
|
||||||
prestmt.setObject(++k, val);
|
prestmt.setObject(++k, val);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import java.io.Serializable;
|
|||||||
import java.lang.reflect.Array;
|
import java.lang.reflect.Array;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.concurrent.*;
|
import java.util.concurrent.*;
|
||||||
|
import java.util.concurrent.atomic.*;
|
||||||
import java.util.function.*;
|
import java.util.function.*;
|
||||||
import java.util.logging.*;
|
import java.util.logging.*;
|
||||||
import java.util.stream.*;
|
import java.util.stream.*;
|
||||||
@@ -226,6 +227,10 @@ public final class EntityCache<T> {
|
|||||||
id = ((Number) id).byteValue();
|
id = ((Number) id).byteValue();
|
||||||
} else if (atype == double.class || atype == Double.class) {
|
} else if (atype == double.class || atype == Double.class) {
|
||||||
id = ((Number) id).doubleValue();
|
id = ((Number) id).doubleValue();
|
||||||
|
} else if (atype == AtomicInteger.class) {
|
||||||
|
id = new AtomicInteger(((Number) id).intValue());
|
||||||
|
} else if (atype == AtomicLong.class) {
|
||||||
|
id = new AtomicLong(((Number) id).longValue());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return this.map.containsKey(id);
|
return this.map.containsKey(id);
|
||||||
@@ -299,11 +304,11 @@ public final class EntityCache<T> {
|
|||||||
if (filter != null) stream = stream.filter(filter);
|
if (filter != null) stream = stream.filter(filter);
|
||||||
switch (func) {
|
switch (func) {
|
||||||
case AVG:
|
case AVG:
|
||||||
if (attr.type() == int.class || attr.type() == Integer.class) {
|
if (attr.type() == int.class || attr.type() == Integer.class || attr.type() == AtomicInteger.class) {
|
||||||
OptionalDouble rs = stream.mapToInt(x -> (Integer) attr.get(x)).average();
|
OptionalDouble rs = stream.mapToInt(x -> ((Number) attr.get(x)).intValue()).average();
|
||||||
return rs.isPresent() ? (int) rs.getAsDouble() : defResult;
|
return rs.isPresent() ? (int) rs.getAsDouble() : defResult;
|
||||||
} else if (attr.type() == long.class || attr.type() == Long.class) {
|
} else if (attr.type() == long.class || attr.type() == Long.class || attr.type() == AtomicLong.class) {
|
||||||
OptionalDouble rs = stream.mapToLong(x -> (Long) attr.get(x)).average();
|
OptionalDouble rs = stream.mapToLong(x -> ((Number) attr.get(x)).longValue()).average();
|
||||||
return rs.isPresent() ? (long) rs.getAsDouble() : defResult;
|
return rs.isPresent() ? (long) rs.getAsDouble() : defResult;
|
||||||
} else if (attr.type() == short.class || attr.type() == Short.class) {
|
} else if (attr.type() == short.class || attr.type() == Short.class) {
|
||||||
OptionalDouble rs = stream.mapToInt(x -> ((Short) attr.get(x)).intValue()).average();
|
OptionalDouble rs = stream.mapToInt(x -> ((Short) attr.get(x)).intValue()).average();
|
||||||
@@ -322,11 +327,11 @@ public final class EntityCache<T> {
|
|||||||
return stream.map(x -> attr.get(x)).distinct().count();
|
return stream.map(x -> attr.get(x)).distinct().count();
|
||||||
|
|
||||||
case MAX:
|
case MAX:
|
||||||
if (attr.type() == int.class || attr.type() == Integer.class) {
|
if (attr.type() == int.class || attr.type() == Integer.class || attr.type() == AtomicInteger.class) {
|
||||||
OptionalInt rs = stream.mapToInt(x -> (Integer) attr.get(x)).max();
|
OptionalInt rs = stream.mapToInt(x -> ((Number) attr.get(x)).intValue()).max();
|
||||||
return rs.isPresent() ? rs.getAsInt() : defResult;
|
return rs.isPresent() ? rs.getAsInt() : defResult;
|
||||||
} else if (attr.type() == long.class || attr.type() == Long.class) {
|
} else if (attr.type() == long.class || attr.type() == Long.class || attr.type() == AtomicLong.class) {
|
||||||
OptionalLong rs = stream.mapToLong(x -> (Long) attr.get(x)).max();
|
OptionalLong rs = stream.mapToLong(x -> ((Number) attr.get(x)).longValue()).max();
|
||||||
return rs.isPresent() ? rs.getAsLong() : defResult;
|
return rs.isPresent() ? rs.getAsLong() : defResult;
|
||||||
} else if (attr.type() == short.class || attr.type() == Short.class) {
|
} else if (attr.type() == short.class || attr.type() == Short.class) {
|
||||||
OptionalInt rs = stream.mapToInt(x -> ((Short) attr.get(x)).intValue()).max();
|
OptionalInt rs = stream.mapToInt(x -> ((Short) attr.get(x)).intValue()).max();
|
||||||
@@ -341,11 +346,11 @@ public final class EntityCache<T> {
|
|||||||
throw new RuntimeException("getNumberResult error(type:" + type + ", attr.declaringClass: " + attr.declaringClass() + ", attr.field: " + attr.field() + ", attr.type: " + attr.type());
|
throw new RuntimeException("getNumberResult error(type:" + type + ", attr.declaringClass: " + attr.declaringClass() + ", attr.field: " + attr.field() + ", attr.type: " + attr.type());
|
||||||
|
|
||||||
case MIN:
|
case MIN:
|
||||||
if (attr.type() == int.class || attr.type() == Integer.class) {
|
if (attr.type() == int.class || attr.type() == Integer.class || attr.type() == AtomicInteger.class) {
|
||||||
OptionalInt rs = stream.mapToInt(x -> (Integer) attr.get(x)).min();
|
OptionalInt rs = stream.mapToInt(x -> ((Number) attr.get(x)).intValue()).min();
|
||||||
return rs.isPresent() ? rs.getAsInt() : defResult;
|
return rs.isPresent() ? rs.getAsInt() : defResult;
|
||||||
} else if (attr.type() == long.class || attr.type() == Long.class) {
|
} else if (attr.type() == long.class || attr.type() == Long.class || attr.type() == AtomicLong.class) {
|
||||||
OptionalLong rs = stream.mapToLong(x -> (Long) attr.get(x)).min();
|
OptionalLong rs = stream.mapToLong(x -> ((Number) attr.get(x)).longValue()).min();
|
||||||
return rs.isPresent() ? rs.getAsLong() : defResult;
|
return rs.isPresent() ? rs.getAsLong() : defResult;
|
||||||
} else if (attr.type() == short.class || attr.type() == Short.class) {
|
} else if (attr.type() == short.class || attr.type() == Short.class) {
|
||||||
OptionalInt rs = stream.mapToInt(x -> ((Short) attr.get(x)).intValue()).min();
|
OptionalInt rs = stream.mapToInt(x -> ((Short) attr.get(x)).intValue()).min();
|
||||||
@@ -360,10 +365,10 @@ public final class EntityCache<T> {
|
|||||||
throw new RuntimeException("getNumberResult error(type:" + type + ", attr.declaringClass: " + attr.declaringClass() + ", attr.field: " + attr.field() + ", attr.type: " + attr.type());
|
throw new RuntimeException("getNumberResult error(type:" + type + ", attr.declaringClass: " + attr.declaringClass() + ", attr.field: " + attr.field() + ", attr.type: " + attr.type());
|
||||||
|
|
||||||
case SUM:
|
case SUM:
|
||||||
if (attr.type() == int.class || attr.type() == Integer.class) {
|
if (attr.type() == int.class || attr.type() == Integer.class || attr.type() == AtomicInteger.class) {
|
||||||
return stream.mapToInt(x -> (Integer) attr.get(x)).sum();
|
return stream.mapToInt(x -> ((Number) attr.get(x)).intValue()).sum();
|
||||||
} else if (attr.type() == long.class || attr.type() == Long.class) {
|
} else if (attr.type() == long.class || attr.type() == Long.class || attr.type() == AtomicLong.class) {
|
||||||
return stream.mapToLong(x -> (Long) attr.get(x)).sum();
|
return stream.mapToLong(x -> ((Number) attr.get(x)).longValue()).sum();
|
||||||
} else if (attr.type() == short.class || attr.type() == Short.class) {
|
} else if (attr.type() == short.class || attr.type() == Short.class) {
|
||||||
return (short) stream.mapToInt(x -> ((Short) attr.get(x)).intValue()).sum();
|
return (short) stream.mapToInt(x -> ((Short) attr.get(x)).intValue()).sum();
|
||||||
} else if (attr.type() == float.class || attr.type() == Float.class) {
|
} else if (attr.type() == float.class || attr.type() == Float.class) {
|
||||||
@@ -628,6 +633,10 @@ public final class EntityCache<T> {
|
|||||||
newval = numb.doubleValue();
|
newval = numb.doubleValue();
|
||||||
} else if (ft == byte.class || ft == Byte.class) {
|
} else if (ft == byte.class || ft == Byte.class) {
|
||||||
newval = numb.byteValue();
|
newval = numb.byteValue();
|
||||||
|
} else if (ft == AtomicInteger.class) {
|
||||||
|
newval = new AtomicInteger(numb.intValue());
|
||||||
|
} else if (ft == AtomicLong.class) {
|
||||||
|
newval = new AtomicLong(numb.longValue());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
attr.set(rs, (V) newval);
|
attr.set(rs, (V) newval);
|
||||||
@@ -657,9 +666,9 @@ public final class EntityCache<T> {
|
|||||||
final String func = sub[0].substring(0, pos);
|
final String func = sub[0].substring(0, pos);
|
||||||
if ("ABS".equalsIgnoreCase(func)) {
|
if ("ABS".equalsIgnoreCase(func)) {
|
||||||
Function getter = null;
|
Function getter = null;
|
||||||
if (pattr.type() == int.class || pattr.type() == Integer.class) {
|
if (pattr.type() == int.class || pattr.type() == Integer.class || pattr.type() == AtomicInteger.class) {
|
||||||
getter = x -> Math.abs(((Number) pattr.get((T) x)).intValue());
|
getter = x -> Math.abs(((Number) pattr.get((T) x)).intValue());
|
||||||
} else if (pattr.type() == long.class || pattr.type() == Long.class) {
|
} else if (pattr.type() == long.class || pattr.type() == Long.class || pattr.type() == AtomicLong.class) {
|
||||||
getter = x -> Math.abs(((Number) pattr.get((T) x)).longValue());
|
getter = x -> Math.abs(((Number) pattr.get((T) x)).longValue());
|
||||||
} else if (pattr.type() == float.class || pattr.type() == Float.class) {
|
} else if (pattr.type() == float.class || pattr.type() == Float.class) {
|
||||||
getter = x -> Math.abs(((Number) pattr.get((T) x)).floatValue());
|
getter = x -> Math.abs(((Number) pattr.get((T) x)).floatValue());
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import java.lang.reflect.*;
|
|||||||
import java.sql.*;
|
import java.sql.*;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
import java.util.concurrent.atomic.*;
|
||||||
import java.util.function.*;
|
import java.util.function.*;
|
||||||
import java.util.logging.*;
|
import java.util.logging.*;
|
||||||
import javax.persistence.*;
|
import javax.persistence.*;
|
||||||
@@ -760,6 +761,18 @@ public final class EntityInfo<T> {
|
|||||||
} else if (t == char.class) {
|
} else if (t == char.class) {
|
||||||
o = (char) 0;
|
o = (char) 0;
|
||||||
}
|
}
|
||||||
|
} else if (t == AtomicInteger.class) {
|
||||||
|
if (o != null) {
|
||||||
|
o = new AtomicInteger(((Number) o).intValue());
|
||||||
|
} else {
|
||||||
|
o = new AtomicInteger();
|
||||||
|
}
|
||||||
|
} else if (t == AtomicLong.class) {
|
||||||
|
if (o != null) {
|
||||||
|
o = new AtomicLong(((Number) o).longValue());
|
||||||
|
} else {
|
||||||
|
o = new AtomicLong();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return o;
|
return o;
|
||||||
|
|||||||
@@ -23,11 +23,16 @@ public interface Reproduce<D, S> extends BiFunction<D, S, D> {
|
|||||||
public D apply(D dest, S src);
|
public D apply(D dest, S src);
|
||||||
|
|
||||||
public static <D, S> Reproduce<D, S> create(final Class<D> destClass, final Class<S> srcClass) {
|
public static <D, S> Reproduce<D, S> create(final Class<D> destClass, final Class<S> srcClass) {
|
||||||
return create(destClass, srcClass, null);
|
return create(destClass, srcClass, (BiPredicate) null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public static <D, S> Reproduce<D, S> create(final Class<D> destClass, final Class<S> srcClass, final Predicate<String> columnPredicate) {
|
public static <D, S> Reproduce<D, S> create(final Class<D> destClass, final Class<S> srcClass, final Predicate<String> columnPredicate) {
|
||||||
|
return create(destClass, srcClass, (sc, m) -> columnPredicate.test(m));
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public static <D, S> Reproduce<D, S> create(final Class<D> destClass, final Class<S> srcClass, final BiPredicate<Class<S>, String> columnPredicate) {
|
||||||
// ------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------
|
||||||
final String supDynName = Reproduce.class.getName().replace('.', '/');
|
final String supDynName = Reproduce.class.getName().replace('.', '/');
|
||||||
final String destName = destClass.getName().replace('.', '/');
|
final String destName = destClass.getName().replace('.', '/');
|
||||||
@@ -72,7 +77,7 @@ public interface Reproduce<D, S> extends BiFunction<D, S, D> {
|
|||||||
final String fname = field.getName();
|
final String fname = field.getName();
|
||||||
try {
|
try {
|
||||||
if (!field.getType().equals(destClass.getField(fname).getType())) continue;
|
if (!field.getType().equals(destClass.getField(fname).getType())) continue;
|
||||||
if (!columnPredicate.test(fname)) continue;
|
if (!columnPredicate.test(srcClass, fname)) continue;
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -99,7 +104,7 @@ public interface Reproduce<D, S> extends BiFunction<D, S, D> {
|
|||||||
cs[0] = Character.toLowerCase(cs[0]);
|
cs[0] = Character.toLowerCase(cs[0]);
|
||||||
col = new String(cs);
|
col = new String(cs);
|
||||||
}
|
}
|
||||||
if (!columnPredicate.test(col)) continue;
|
if (!columnPredicate.test(srcClass, col)) continue;
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
continue;
|
continue;
|
||||||
|
|||||||
Reference in New Issue
Block a user