Skip to content

Commit ce9c032

Browse files
committed
HHH-18532 Suggested fix to conversion of epoch time in milliseconds to java.sql.Time
1 parent a2bd7b2 commit ce9c032

11 files changed

+24
-19
lines changed

hibernate-core/src/main/java/org/hibernate/type/descriptor/java/AbstractTemporalJavaType.java

+11
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@
44
*/
55
package org.hibernate.type.descriptor.java;
66

7+
import java.sql.Time;
8+
import java.time.Instant;
9+
import java.time.LocalTime;
10+
import java.time.ZoneId;
711
import java.util.Comparator;
812

913
import jakarta.persistence.TemporalType;
@@ -60,6 +64,13 @@ private <X> TemporalJavaType<X> forMissingPrecision(TypeConfiguration typeConfig
6064
return (TemporalJavaType) this;
6165
}
6266

67+
public static Time millisToSqlTime(long millis) {
68+
final LocalTime localTime = Instant.ofEpochMilli( millis ).atZone( ZoneId.systemDefault() ).toLocalTime();
69+
final Time time = Time.valueOf( localTime );
70+
time.setTime( time.getTime() + localTime.getNano() / 1_000_000 );
71+
return time;
72+
}
73+
6374
protected <X> TemporalJavaType<X> forTimestampPrecision(TypeConfiguration typeConfiguration) {
6475
throw new UnsupportedOperationException(
6576
this + " as `jakarta.persistence.TemporalType.TIMESTAMP` not supported"

hibernate-core/src/main/java/org/hibernate/type/descriptor/java/CalendarDateJavaType.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ public <X> X unwrap(Calendar value, Class<X> type, WrapperOptions options) {
100100
return (X) new java.sql.Date( value.getTimeInMillis() );
101101
}
102102
if ( java.sql.Time.class.isAssignableFrom( type ) ) {
103-
return (X) new java.sql.Time( value.getTimeInMillis() % 86_400_000 );
103+
return (X) millisToSqlTime( value.getTimeInMillis() );
104104
}
105105
if ( java.sql.Timestamp.class.isAssignableFrom( type ) ) {
106106
return (X) new java.sql.Timestamp( value.getTimeInMillis() );

hibernate-core/src/main/java/org/hibernate/type/descriptor/java/CalendarJavaType.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ public <X> X unwrap(Calendar value, Class<X> type, WrapperOptions options) {
117117
return (X) new java.sql.Date( value.getTimeInMillis() );
118118
}
119119
if ( java.sql.Time.class.isAssignableFrom( type ) ) {
120-
return (X) new java.sql.Time( value.getTimeInMillis() % 86_400_000 );
120+
return (X) millisToSqlTime( value.getTimeInMillis() );
121121
}
122122
if ( java.sql.Timestamp.class.isAssignableFrom( type ) ) {
123123
return (X) new java.sql.Timestamp( value.getTimeInMillis() );

hibernate-core/src/main/java/org/hibernate/type/descriptor/java/CalendarTimeJavaType.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ public <X> X unwrap(Calendar value, Class<X> type, WrapperOptions options) {
102102
return (X) new java.sql.Date( value.getTimeInMillis() );
103103
}
104104
if ( java.sql.Time.class.isAssignableFrom( type ) ) {
105-
return (X) new java.sql.Time( value.getTimeInMillis() % 86_400_000 );
105+
return (X) millisToSqlTime( value.getTimeInMillis() );
106106
}
107107
if ( java.sql.Timestamp.class.isAssignableFrom( type ) ) {
108108
return (X) new java.sql.Timestamp( value.getTimeInMillis() );

hibernate-core/src/main/java/org/hibernate/type/descriptor/java/DateJavaType.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ public <X> X unwrap(Date value, Class<X> type, WrapperOptions options) {
124124
if ( java.sql.Time.class.isAssignableFrom( type ) ) {
125125
final java.sql.Time rtn = value instanceof java.sql.Time
126126
? ( java.sql.Time ) value
127-
: new java.sql.Time( value.getTime() % 86_400_000 );
127+
: millisToSqlTime( value.getTime() );
128128
return (X) rtn;
129129
}
130130
if ( java.sql.Timestamp.class.isAssignableFrom( type ) ) {

hibernate-core/src/main/java/org/hibernate/type/descriptor/java/InstantJavaType.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ public <X> X unwrap(Instant instant, Class<X> type, WrapperOptions options) {
126126
}
127127

128128
if ( java.sql.Time.class.isAssignableFrom( type ) ) {
129-
return (X) new java.sql.Time( instant.toEpochMilli() % 86_400_000 );
129+
return (X) millisToSqlTime( instant.toEpochMilli() );
130130
}
131131

132132
if ( Date.class.isAssignableFrom( type ) ) {

hibernate-core/src/main/java/org/hibernate/type/descriptor/java/JdbcTimeJavaType.java

+4-10
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ public Object unwrap(Date value, Class type, WrapperOptions options) {
120120
if ( LocalTime.class.isAssignableFrom( type ) ) {
121121
final Time time = value instanceof java.sql.Time
122122
? ( (java.sql.Time) value )
123-
: new java.sql.Time( value.getTime() % 86_400_000 );
123+
: millisToSqlTime( value.getTime() );
124124
final LocalTime localTime = time.toLocalTime();
125125
long millis = time.getTime() % 1000;
126126
if ( millis == 0 ) {
@@ -135,9 +135,7 @@ public Object unwrap(Date value, Class type, WrapperOptions options) {
135135
}
136136

137137
if ( Time.class.isAssignableFrom( type ) ) {
138-
return value instanceof Time
139-
? value
140-
: new Time( value.getTime() % 86_400_000 );
138+
return millisToSqlTime( value.getTime() );
141139
}
142140

143141
if ( java.sql.Timestamp.class.isAssignableFrom( type ) ) {
@@ -175,12 +173,8 @@ public Date wrap(Object value, WrapperOptions options) {
175173
return null;
176174
}
177175

178-
if ( value instanceof Time time ) {
179-
return time;
180-
}
181-
182176
if ( value instanceof Date date ) {
183-
return new Time( date.getTime() % 86_400_000 );
177+
return millisToSqlTime( date.getTime() );
184178
}
185179

186180
if ( value instanceof LocalTime localTime ) {
@@ -197,7 +191,7 @@ public Date wrap(Object value, WrapperOptions options) {
197191
}
198192

199193
if ( value instanceof Calendar calendar ) {
200-
return new Time( calendar.getTimeInMillis() % 86_400_000 );
194+
return millisToSqlTime( calendar.getTimeInMillis() );
201195
}
202196

203197
throw unknownWrap( value.getClass() );

hibernate-core/src/main/java/org/hibernate/type/descriptor/java/JdbcTimestampJavaType.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ public Object unwrap(Date value, Class type, WrapperOptions options) {
136136
if ( java.sql.Time.class.isAssignableFrom( type ) ) {
137137
return value instanceof java.sql.Time
138138
? ( java.sql.Time ) value
139-
: new java.sql.Time( value.getTime() );
139+
: millisToSqlTime( value.getTime() );
140140
}
141141

142142
if ( Date.class.isAssignableFrom( type ) ) {

hibernate-core/src/main/java/org/hibernate/type/descriptor/java/LocalDateTimeJavaType.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ public <X> X unwrap(LocalDateTime value, Class<X> type, WrapperOptions options)
102102

103103
if ( java.sql.Time.class.isAssignableFrom( type ) ) {
104104
Instant instant = value.atZone( ZoneId.systemDefault() ).toInstant();
105-
return (X) new java.sql.Time( instant.toEpochMilli() );
105+
return (X) millisToSqlTime( instant.toEpochMilli() );
106106
}
107107

108108
if ( Date.class.isAssignableFrom( type ) ) {

hibernate-core/src/main/java/org/hibernate/type/descriptor/java/OffsetDateTimeJavaType.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ public <X> X unwrap(OffsetDateTime offsetDateTime, Class<X> type, WrapperOptions
162162
}
163163

164164
if ( java.sql.Time.class.isAssignableFrom( type ) ) {
165-
return (X) new java.sql.Time( offsetDateTime.toInstant().toEpochMilli() );
165+
return (X) millisToSqlTime( offsetDateTime.toInstant().toEpochMilli() );
166166
}
167167

168168
if ( Date.class.isAssignableFrom( type ) ) {

hibernate-core/src/main/java/org/hibernate/type/descriptor/java/ZonedDateTimeJavaType.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ public <X> X unwrap(ZonedDateTime zonedDateTime, Class<X> type, WrapperOptions o
124124
}
125125

126126
if ( java.sql.Time.class.isAssignableFrom( type ) ) {
127-
return (X) new java.sql.Time( zonedDateTime.toInstant().toEpochMilli() );
127+
return (X) millisToSqlTime( zonedDateTime.toInstant().toEpochMilli() );
128128
}
129129

130130
if ( Date.class.isAssignableFrom( type ) ) {

0 commit comments

Comments
 (0)