15
15
*/
16
16
package org .springframework .data .jdbc .core .dialect ;
17
17
18
- import java .time .OffsetDateTime ;
19
- import java .time .ZoneOffset ;
20
18
import java .util .ArrayList ;
21
19
import java .util .Collection ;
22
20
import java .util .List ;
23
21
24
- import org .h2 .api .TimestampWithTimeZone ;
25
- import org .springframework .core .convert .converter .Converter ;
26
- import org .springframework .data .convert .ReadingConverter ;
27
22
import org .springframework .data .relational .core .dialect .Db2Dialect ;
28
23
import org .springframework .data .relational .core .dialect .H2Dialect ;
29
24
@@ -43,39 +38,26 @@ protected JdbcH2Dialect() {}
43
38
@ Override
44
39
public Collection <Object > getConverters () {
45
40
46
- List <Object > converters = new ArrayList <>(super .getConverters ());
47
- converters .add (TimestampWithTimeZoneToOffsetDateTimeConverter .INSTANCE );
48
- return converters ;
49
- }
50
-
51
- @ ReadingConverter
52
- enum TimestampWithTimeZoneToOffsetDateTimeConverter implements Converter <TimestampWithTimeZone , OffsetDateTime > {
53
-
54
- INSTANCE ;
41
+ final Collection <Object > originalConverters = super .getConverters ();
55
42
56
- @ Override
57
- public OffsetDateTime convert (TimestampWithTimeZone source ) {
43
+ if (isH2belowVersion2 ()) {
58
44
59
- long nanosInSecond = 1_000_000_000 ;
60
- long nanosInMinute = nanosInSecond * 60 ;
61
- long nanosInHour = nanosInMinute * 60 ;
62
-
63
- long hours = (source .getNanosSinceMidnight () / nanosInHour );
45
+ List <Object > converters = new ArrayList <>(originalConverters );
46
+ converters .add (H2TimestampWithTimeZoneToOffsetDateTimeConverter .INSTANCE );
47
+ return converters ;
48
+ }
64
49
65
- long nanosInHours = hours * nanosInHour ;
66
- long nanosLeft = source .getNanosSinceMidnight () - nanosInHours ;
67
- long minutes = nanosLeft / nanosInMinute ;
50
+ return originalConverters ;
51
+ }
68
52
69
- long nanosInMinutes = minutes * nanosInMinute ;
70
- nanosLeft -= nanosInMinutes ;
71
- long seconds = nanosLeft / nanosInSecond ;
53
+ static boolean isH2belowVersion2 () {
72
54
73
- long nanosInSeconds = seconds * nanosInSecond ;
74
- nanosLeft -= nanosInSeconds ;
75
- ZoneOffset offset = ZoneOffset .ofTotalSeconds (source .getTimeZoneOffsetSeconds ());
55
+ try {
76
56
77
- return OffsetDateTime .of (source .getYear (), source .getMonth (), source .getDay (), (int ) hours , (int ) minutes ,
78
- (int ) seconds , (int ) nanosLeft , offset );
57
+ JdbcH2Dialect .class .getClassLoader ().loadClass ("org.h2.api.TimestampWithTimeZone" );
58
+ return true ;
59
+ } catch (ClassNotFoundException e ) {
60
+ return false ;
79
61
}
80
62
}
81
63
}
0 commit comments