5
5
*/
6
6
package org .hibernate .reactive .pool .impl ;
7
7
8
+ import java .sql .JDBCType ;
8
9
import java .sql .ResultSet ;
10
+ import java .sql .Types ;
9
11
import java .util .ArrayList ;
10
12
import java .util .List ;
11
13
import java .util .Objects ;
12
14
import java .util .concurrent .CompletionStage ;
13
15
16
+ import io .vertx .sqlclient .data .NullValue ;
14
17
import org .hibernate .engine .jdbc .internal .FormatStyle ;
15
18
import org .hibernate .engine .jdbc .spi .SqlStatementLogger ;
16
19
import org .hibernate .reactive .adaptor .impl .ResultSetAdaptor ;
@@ -51,13 +54,15 @@ public class SqlClientConnection implements ReactiveConnection {
51
54
52
55
@ Override
53
56
public CompletionStage <Integer > update (String sql , Object [] paramValues ) {
57
+ translateNulls ( paramValues );
54
58
return update ( sql , Tuple .wrap ( paramValues ) );
55
59
}
56
60
57
61
@ Override
58
62
public CompletionStage <int []> update (String sql , List <Object []> batchParamValues ) {
59
63
final List <Tuple > tuples = new ArrayList <>( batchParamValues .size () );
60
- for ( Object [] paramValues : batchParamValues ) {
64
+ for ( Object [] paramValues : batchParamValues ) {
65
+ translateNulls ( paramValues );
61
66
tuples .add ( Tuple .wrap ( paramValues ) );
62
67
}
63
68
return updateBatch ( sql , tuples );
@@ -72,11 +77,13 @@ public CompletionStage<Void> update(String sql, Object[] paramValues,
72
77
73
78
@ Override
74
79
public CompletionStage <Long > insertAndSelectIdentifier (String sql , Object [] paramValues ) {
80
+ translateNulls ( paramValues );
75
81
return insertAndSelectIdentifier ( sql , Tuple .wrap ( paramValues ) );
76
82
}
77
83
78
84
@ Override
79
85
public CompletionStage <Long > selectIdentifier (String sql , Object [] paramValues ) {
86
+ translateNulls ( paramValues );
80
87
return preparedQuery ( sql , Tuple .wrap ( paramValues ) )
81
88
.thenApply ( rowSet -> {
82
89
for (Row row : rowSet ) {
@@ -93,11 +100,13 @@ public CompletionStage<Result> select(String sql) {
93
100
94
101
@ Override
95
102
public CompletionStage <Result > select (String sql , Object [] paramValues ) {
103
+ translateNulls ( paramValues );
96
104
return preparedQuery ( sql , Tuple .wrap ( paramValues ) ).thenApply (RowSetResult ::new );
97
105
}
98
106
99
107
@ Override
100
108
public CompletionStage <ResultSet > selectJdbc (String sql , Object [] paramValues ) {
109
+ translateNulls ( paramValues );
101
110
return preparedQuery ( sql , Tuple .wrap ( paramValues ) ).thenApply (ResultSetAdaptor ::new );
102
111
}
103
112
@@ -264,4 +273,58 @@ public Object[] next() {
264
273
public CompletionStage <Void > executeBatch () {
265
274
return voidFuture ();
266
275
}
276
+
277
+ private static void translateNulls (Object [] paramValues ) {
278
+ for (int i = 0 ; i < paramValues .length ; i ++) {
279
+ Object arg = paramValues [i ];
280
+ if (arg instanceof JDBCType ) {
281
+ paramValues [i ] = toNullValue ( (JDBCType ) arg );
282
+ }
283
+ }
284
+ }
285
+
286
+ private static NullValue toNullValue (JDBCType jdbcType ) {
287
+ switch ( jdbcType .getVendorTypeNumber () ) {
288
+ case Types .BOOLEAN :
289
+ case Types .BIT : //we misuse BIT in H5
290
+ return NullValue .Boolean ;
291
+ case Types .VARCHAR :
292
+ case Types .NVARCHAR :
293
+ case Types .CHAR :
294
+ case Types .NCHAR :
295
+ case Types .CLOB :
296
+ case Types .NCLOB :
297
+ case Types .LONGVARCHAR :
298
+ case Types .LONGNVARCHAR :
299
+ return NullValue .String ;
300
+ case Types .FLOAT :
301
+ case Types .DOUBLE :
302
+ case Types .REAL :
303
+ return NullValue .Double ;
304
+ case Types .BIGINT :
305
+ return NullValue .Long ;
306
+ case Types .INTEGER :
307
+ return NullValue .Integer ;
308
+ case Types .SMALLINT :
309
+ case Types .TINYINT : //should really map to Byte
310
+ return NullValue .Short ;
311
+ case Types .DECIMAL :
312
+ return NullValue .BigDecimal ;
313
+ case Types .BINARY :
314
+ case Types .BLOB :
315
+ case Types .LONGVARBINARY :
316
+ return NullValue .Buffer ;
317
+ case Types .TIMESTAMP :
318
+ return NullValue .LocalDateTime ;
319
+ case Types .DATE :
320
+ return NullValue .LocalDate ;
321
+ case Types .TIME :
322
+ return NullValue .LocalTime ;
323
+ case Types .TIMESTAMP_WITH_TIMEZONE :
324
+ return NullValue .OffsetDateTime ;
325
+ case Types .TIME_WITH_TIMEZONE :
326
+ return NullValue .OffsetTime ;
327
+ default : return null ;
328
+ }
329
+ }
267
330
}
0 commit comments