Skip to content

Commit 1f2d969

Browse files
committed
Merge branch '4.2' of github.com:/hs-web/hsweb-easy-orm into 4.2
2 parents 37ac101 + 16f459e commit 1f2d969

File tree

19 files changed

+355
-194
lines changed

19 files changed

+355
-194
lines changed

hsweb-easy-orm-core/src/main/java/org/hswebframework/ezorm/core/ValueCodec.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@ default E encodeNull(){
1212

1313
D decode(Object data);
1414

15+
default E encodeNull(ColumnMetadata column){
16+
return encodeNull();
17+
}
18+
1519
default E encode(Object value, ColumnMetadata column){
1620
return encode(value);
1721
}

hsweb-easy-orm-core/src/main/java/org/hswebframework/ezorm/core/meta/AbstractColumnMetadata.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ public Object decode(Object data) {
5858
public Object encode(Object data) {
5959
if (data == null) {
6060
if (valueCodec != null) {
61-
return valueCodec.encodeNull();
61+
return valueCodec.encodeNull(this);
6262
}
6363
return null;
6464
}

hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/codec/ClobValueCodec.java

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,10 @@
55
import lombok.SneakyThrows;
66
import org.hswebframework.ezorm.core.ValueCodec;
77
import org.hswebframework.ezorm.core.meta.ColumnMetadata;
8+
import org.hswebframework.ezorm.rdb.executor.NullValue;
9+
import org.hswebframework.ezorm.rdb.metadata.DataType;
810
import org.hswebframework.ezorm.rdb.metadata.RDBColumnMetadata;
11+
import org.hswebframework.ezorm.rdb.supports.oracle.OracleDialect;
912
import org.hswebframework.ezorm.rdb.utils.FeatureUtils;
1013
import reactor.core.publisher.Flux;
1114
import reactor.core.publisher.Mono;
@@ -21,14 +24,29 @@ public class ClobValueCodec implements ValueCodec {
2124

2225
public static final ClobValueCodec INSTANCE = new ClobValueCodec();
2326

27+
public static boolean isClobType(DataType type) {
28+
return type.getSqlType() == JDBCType.LONGVARCHAR ||
29+
type.getSqlType() == JDBCType.LONGNVARCHAR ||
30+
type.getSqlType() == JDBCType.CLOB;
31+
}
32+
33+
@Override
34+
public Object encodeNull(ColumnMetadata column) {
35+
if (column instanceof RDBColumnMetadata col) {
36+
if (ClobValueCodec.isClobType(col.getType())) {
37+
return NullValue.of(LongCharSequence.class, col.getType());
38+
}
39+
return NullValue.of(col.getType());
40+
}
41+
return null;
42+
}
43+
2444
@Override
2545
public Object encode(Object value, ColumnMetadata column) {
2646
Object val = this.encode(value);
2747
if (val instanceof CharSequence cs && column instanceof RDBColumnMetadata col) {
28-
if (col.getType().getSqlType() == JDBCType.LONGVARCHAR ||
29-
col.getType().getSqlType() == JDBCType.LONGNVARCHAR ||
30-
col.getType().getSqlType() == JDBCType.CLOB) {
31-
return new ClobValue(cs);
48+
if (ClobValueCodec.isClobType(col.getType())) {
49+
return new LongCharSequence(cs);
3250
}
3351
}
3452
return val;

hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/codec/JsonValueCodec.java

Lines changed: 33 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -11,20 +11,21 @@
1111
import lombok.extern.slf4j.Slf4j;
1212
import org.hswebframework.ezorm.core.ValueCodec;
1313
import org.hswebframework.ezorm.core.meta.ColumnMetadata;
14+
import org.hswebframework.ezorm.rdb.executor.NullValue;
1415
import org.hswebframework.ezorm.rdb.metadata.RDBColumnMetadata;
1516
import org.hswebframework.ezorm.rdb.utils.FeatureUtils;
1617
import org.reactivestreams.Publisher;
1718
import reactor.core.publisher.Flux;
1819
import reactor.core.publisher.Mono;
1920

2021
import java.io.InputStream;
22+
import java.io.Reader;
2123
import java.lang.reflect.Field;
2224
import java.lang.reflect.ParameterizedType;
2325
import java.lang.reflect.Type;
2426
import java.nio.ByteBuffer;
2527
import java.sql.Blob;
2628
import java.sql.Clob;
27-
import java.sql.JDBCType;
2829
import java.util.Collection;
2930
import java.util.Map;
3031
import java.util.TimeZone;
@@ -104,15 +105,25 @@ public JsonValueCodec(Class<?> targetType, JavaType type) {
104105
this.targetType = targetType;
105106
}
106107

108+
@Override
109+
public Object encodeNull(ColumnMetadata column) {
110+
if (column instanceof RDBColumnMetadata col) {
111+
// clob 类型
112+
if (ClobValueCodec.isClobType(col.getType())) {
113+
return NullValue.of(LongCharSequence.class, col.getType());
114+
}
115+
return NullValue.of(col.getType());
116+
}
117+
return ValueCodec.super.encodeNull(column);
118+
}
119+
107120
@Override
108121
public Object encode(Object value, ColumnMetadata column) {
109122
Object data = encode(value);
110123
if (data instanceof CharSequence cs && column instanceof RDBColumnMetadata col) {
111124
// clob 类型
112-
if (col.getType().getSqlType() == JDBCType.LONGVARCHAR ||
113-
col.getType().getSqlType() == JDBCType.LONGNVARCHAR ||
114-
col.getType().getSqlType() == JDBCType.CLOB) {
115-
return new ClobValue(cs);
125+
if (ClobValueCodec.isClobType(col.getType())) {
126+
return new LongCharSequence(cs);
116127
}
117128
}
118129
return data;
@@ -149,27 +160,29 @@ public Object decode(Object data) {
149160
try {
150161
Object target = data;
151162

152-
if (data instanceof Clob) {
153-
target = mapper.readValue(((Clob) data).getCharacterStream(), jacksonType);
154-
} else if (data instanceof Blob) {
155-
target = mapper.readValue(((Blob) data).getBinaryStream(), jacksonType);
163+
if (data instanceof Clob _clob) {
164+
target = mapper.readValue(_clob.getCharacterStream(), jacksonType);
165+
} else if (data instanceof Blob _blob) {
166+
target = mapper.readValue(_blob.getBinaryStream(), jacksonType);
156167
} else if (data instanceof InputStream) {
157168
target = mapper.readValue((InputStream) data, jacksonType);
158-
} else if (data instanceof byte[]) {
159-
target = mapper.readValue((byte[]) data, jacksonType);
160-
} else if (data instanceof String) {
161-
target = doRead(((String) data));
169+
} else if (data instanceof byte[] bytes) {
170+
target = mapper.readValue(bytes, jacksonType);
171+
} else if (data instanceof CharSequence) {
172+
target = doRead(String.valueOf(data));
173+
} else if (data instanceof Reader reader) {
174+
target = mapper.readValue(reader, jacksonType);
162175
} else if (data instanceof ByteBuffer) {
163176
return doRead(new ByteBufferBackedInputStream(((ByteBuffer) data)));
164177
} else if (FeatureUtils.r2dbcIsAlive()) {
165178
Mono<?> mono = null;
166-
if (data instanceof io.r2dbc.spi.Clob) {
167-
mono = Flux.from(((io.r2dbc.spi.Clob) data).stream())
179+
if (data instanceof io.r2dbc.spi.Clob _clob) {
180+
mono = Flux.from(_clob.stream())
168181
.collect(Collectors.joining())
169182
.map(this::doRead);
170183

171-
} else if (data instanceof io.r2dbc.spi.Blob) {
172-
mono = Mono.from(((io.r2dbc.spi.Blob) data).stream())
184+
} else if (data instanceof io.r2dbc.spi.Blob _blob) {
185+
mono = Mono.from(_blob.stream())
173186
.map(ByteBufferBackedInputStream::new)
174187
.map(this::doRead);
175188
}
@@ -194,6 +207,9 @@ public Object decode(Object data) {
194207
if (targetType == Flux.class) {
195208
return target == null ? Flux.empty() : Flux.just(target);
196209
}
210+
if (target == null) {
211+
return null;
212+
}
197213
log.warn("unsupported json format:{}", data);
198214
return target;
199215
} catch (Throwable e) {

hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/codec/ClobValue.java renamed to hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/codec/LongCharSequence.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,16 @@
11
package org.hswebframework.ezorm.rdb.codec;
22

3-
import org.reactivestreams.Publisher;
43
import reactor.util.annotation.NonNull;
54

6-
import java.io.IOException;
75
import java.io.Reader;
86
import java.io.StringReader;
97
import java.util.stream.IntStream;
108

11-
public class ClobValue implements CharSequence {
9+
public class LongCharSequence implements CharSequence {
1210

1311
private final CharSequence charSequence;
1412

15-
public ClobValue(CharSequence charSequence) {
13+
public LongCharSequence(CharSequence charSequence) {
1614
this.charSequence = charSequence;
1715
}
1816

hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/executor/NullValue.java

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,21 @@
88
@Getter
99
@AllArgsConstructor(staticName = "of")
1010
public class NullValue {
11-
@Deprecated
12-
private Class type;
1311

14-
@NonNull
12+
private Class<?> type;
13+
1514
private DataType dataType;
1615

17-
public static NullValue of(DataType dataType){
18-
return of(dataType.getJavaType(),dataType);
16+
public static NullValue of(DataType dataType) {
17+
return of(dataType.getJavaType(), dataType);
18+
}
19+
20+
public Class<?> getType() {
21+
return type == null ? dataType.getJavaType() : type;
1922
}
2023

2124
@Override
2225
public String toString() {
23-
return "null" + (dataType==null?"": (type != null ? "(" + dataType.getId() + ")" : ""));
26+
return "null" + (type != null ? "("+type.getSimpleName()+")" : (dataType != null ? "(" + dataType.getId() + ")" : ""));
2427
}
2528
}

hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/executor/jdbc/JdbcSqlExecutorHelper.java

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
package org.hswebframework.ezorm.rdb.executor.jdbc;
22

33
import lombok.SneakyThrows;
4-
import org.hswebframework.ezorm.rdb.codec.ClobValue;
4+
import org.hswebframework.ezorm.rdb.codec.LongCharSequence;
55
import org.hswebframework.ezorm.rdb.executor.NullValue;
66

7-
import javax.sql.rowset.serial.SerialClob;
87
import java.io.ByteArrayInputStream;
9-
import java.io.CharArrayReader;
8+
import java.io.StringReader;
109
import java.sql.*;
1110
import java.util.ArrayList;
1211
import java.util.Date;
@@ -38,18 +37,17 @@ protected static void preparedStatementParameter(PreparedStatement statement, Ob
3837
for (Object object : parameter) {
3938
if (object == null) {
4039
statement.setNull(index++, Types.NULL);
41-
} else if (object instanceof NullValue) {
42-
statement.setNull(index++, ((NullValue) object).getDataType().getSqlType().getVendorTypeNumber());
40+
} else if (object instanceof NullValue nullValue) {
41+
statement.setNull(index++, nullValue.getDataType().getSqlType().getVendorTypeNumber());
4342
} else if (object instanceof Date) {
4443
statement.setTimestamp(index++, new java.sql.Timestamp(((Date) object).getTime()));
4544
} else if (object instanceof byte[] b) {
4645
statement.setBlob(index++, new ByteArrayInputStream(b));
47-
} else if (object instanceof ClobValue cb) {
46+
} else if (object instanceof LongCharSequence cb) {
4847
statement.setCharacterStream(index++, cb.reader());
4948
} else {
5049
statement.setObject(index++, object);
5150
}
52-
5351
}
5452
}
5553

hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/executor/reactive/r2dbc/R2dbcReactiveSqlExecutor.java

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import lombok.Setter;
66
import lombok.extern.slf4j.Slf4j;
77
import org.hswebframework.ezorm.core.CastUtil;
8-
import org.hswebframework.ezorm.rdb.codec.ClobValue;
8+
import org.hswebframework.ezorm.rdb.codec.LongCharSequence;
99
import org.hswebframework.ezorm.rdb.executor.BatchSqlRequest;
1010
import org.hswebframework.ezorm.rdb.executor.DefaultColumnWrapperContext;
1111
import org.hswebframework.ezorm.rdb.executor.NullValue;
@@ -251,11 +251,18 @@ protected Statement prepareStatement(Statement statement, SqlRequest request) {
251251
for (Object parameter : request.getParameters()) {
252252
if (parameter == null) {
253253
bindNull(statement, index, String.class);
254-
} else if (parameter instanceof NullValue) {
255-
bindNull(statement, index, ((NullValue) parameter).getDataType().getJavaType());
254+
} else if (parameter instanceof NullValue nullValue) {
255+
Class<?> javaType = nullValue.getType();
256+
if (javaType == LongCharSequence.class) {
257+
// 空字符,批量保存时,有的数据库不同行不能有的设置null有的不设置.
258+
bindNull(statement, index, Clob.class);
259+
}else {
260+
bindNull(statement, index, javaType);
261+
}
262+
256263
} else {
257264
// convert clob
258-
if (parameter instanceof ClobValue cb) {
265+
if (parameter instanceof LongCharSequence cb) {
259266
parameter = Clob.from(Mono.just(cb.source()));
260267
}
261268
bind(statement, index, parameter);

hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/metadata/RDBColumnMetadata.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ public RDBColumnMetadata clone() {
221221
public Object encode(Object data) {
222222
if (data == null || data instanceof NullValue) {
223223
if (valueCodec != null) {
224-
Object newVal = valueCodec.encodeNull();
224+
Object newVal = valueCodec.encodeNull(this);
225225
if (newVal != null) {
226226
return newVal;
227227
}

hsweb-easy-orm-rdb/src/main/java/org/hswebframework/ezorm/rdb/metadata/RDBSchemaMetadata.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import org.hswebframework.ezorm.rdb.operator.builder.fragments.ddl.CommonCreateIndexSqlBuilder;
1111
import org.hswebframework.ezorm.rdb.operator.builder.fragments.ddl.CommonCreateTableSqlBuilder;
1212
import org.hswebframework.ezorm.rdb.operator.builder.fragments.ddl.CommonDropIndexSqlBuilder;
13+
import org.hswebframework.ezorm.rdb.operator.builder.fragments.function.SimpleFunctionFragmentBuilder;
1314
import org.hswebframework.ezorm.rdb.operator.builder.fragments.term.DefaultForeignKeyTermFragmentBuilder;
1415
import org.hswebframework.ezorm.rdb.utils.FeatureUtils;
1516
import reactor.core.publisher.Flux;
@@ -67,6 +68,11 @@ public RDBSchemaMetadata(String name) {
6768
addFeature(RDBFeatures.min);
6869
addFeature(RDBFeatures.avg);
6970

71+
addFeature(new SimpleFunctionFragmentBuilder("stddev", "标准差"));
72+
addFeature(new SimpleFunctionFragmentBuilder("variance", "方差"));
73+
addFeature(new SimpleFunctionFragmentBuilder("stddev_pop", "标准差(总体)"));
74+
addFeature(new SimpleFunctionFragmentBuilder("stddev_samp", "标准差(样本)"));
75+
7076

7177
/* DDL */
7278

0 commit comments

Comments
 (0)