Skip to content

Commit a2bd7b2

Browse files
committed
HHH-18532 Fixed two things:
- reordered matching in unwrap methods to push java.util.Date after java.sql.{Date,Time,Timestamp} - use new java.sql.{Date,Time}(instant.toEpochMilli()) instead of java.sql.{Date,Time}.from(instant); later method is not subclasses so it is always returning instance of java.util.Date
1 parent 1e41e35 commit a2bd7b2

File tree

7 files changed

+38
-34
lines changed

7 files changed

+38
-34
lines changed

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

+8-8
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,14 @@ public Object unwrap(Date value, Class type, WrapperOptions options) {
123123
return unwrapSqlDate( value );
124124
}
125125

126+
if ( java.sql.Timestamp.class.isAssignableFrom( type ) ) {
127+
return new java.sql.Timestamp( unwrapDateEpoch( value ) );
128+
}
129+
130+
if ( java.sql.Time.class.isAssignableFrom( type ) ) {
131+
throw new IllegalArgumentException( "Illegal attempt to treat `java.sql.Date` as `java.sql.Time`" );
132+
}
133+
126134
if ( java.util.Date.class.isAssignableFrom( type ) ) {
127135
return value;
128136
}
@@ -141,14 +149,6 @@ public Object unwrap(Date value, Class type, WrapperOptions options) {
141149
return cal;
142150
}
143151

144-
if ( java.sql.Timestamp.class.isAssignableFrom( type ) ) {
145-
return new java.sql.Timestamp( unwrapDateEpoch( value ) );
146-
}
147-
148-
if ( java.sql.Time.class.isAssignableFrom( type ) ) {
149-
throw new IllegalArgumentException( "Illegal attempt to treat `java.sql.Date` as `java.sql.Time`" );
150-
}
151-
152152
throw unknownUnwrap( type );
153153
}
154154

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

+8-8
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,14 @@ public Object unwrap(Date value, Class type, WrapperOptions options) {
140140
: new Time( value.getTime() % 86_400_000 );
141141
}
142142

143+
if ( java.sql.Timestamp.class.isAssignableFrom( type ) ) {
144+
return new java.sql.Timestamp( value.getTime() );
145+
}
146+
147+
if ( java.sql.Date.class.isAssignableFrom( type ) ) {
148+
throw new IllegalArgumentException( "Illegal attempt to treat `java.sql.Time` as `java.sql.Date`" );
149+
}
150+
143151
if ( Date.class.isAssignableFrom( type ) ) {
144152
return value;
145153
}
@@ -158,14 +166,6 @@ public Object unwrap(Date value, Class type, WrapperOptions options) {
158166
return cal;
159167
}
160168

161-
if ( java.sql.Timestamp.class.isAssignableFrom( type ) ) {
162-
return new java.sql.Timestamp( value.getTime() );
163-
}
164-
165-
if ( java.sql.Date.class.isAssignableFrom( type ) ) {
166-
throw new IllegalArgumentException( "Illegal attempt to treat `java.sql.Time` as `java.sql.Date`" );
167-
}
168-
169169
throw unknownUnwrap( type );
170170
}
171171

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

+12-12
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,18 @@ public Object unwrap(Date value, Class type, WrapperOptions options) {
127127
: new Timestamp( value.getTime() );
128128
}
129129

130+
if ( java.sql.Date.class.isAssignableFrom( type ) ) {
131+
return value instanceof java.sql.Date
132+
? ( java.sql.Date ) value
133+
: new java.sql.Date( value.getTime() );
134+
}
135+
136+
if ( java.sql.Time.class.isAssignableFrom( type ) ) {
137+
return value instanceof java.sql.Time
138+
? ( java.sql.Time ) value
139+
: new java.sql.Time( value.getTime() );
140+
}
141+
130142
if ( Date.class.isAssignableFrom( type ) ) {
131143
return value;
132144
}
@@ -146,18 +158,6 @@ public Object unwrap(Date value, Class type, WrapperOptions options) {
146158
return value.getTime();
147159
}
148160

149-
if ( java.sql.Date.class.isAssignableFrom( type ) ) {
150-
return value instanceof java.sql.Date
151-
? ( java.sql.Date ) value
152-
: new java.sql.Date( value.getTime() );
153-
}
154-
155-
if ( java.sql.Time.class.isAssignableFrom( type ) ) {
156-
return value instanceof java.sql.Time
157-
? ( java.sql.Time ) value
158-
: new java.sql.Time( value.getTime() % 86_400_000 );
159-
}
160-
161161
throw unknownUnwrap( type );
162162
}
163163

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -97,12 +97,12 @@ public <X> X unwrap(LocalDateTime value, Class<X> type, WrapperOptions options)
9797

9898
if ( java.sql.Date.class.isAssignableFrom( type ) ) {
9999
Instant instant = value.atZone( ZoneId.systemDefault() ).toInstant();
100-
return (X) java.sql.Date.from( instant );
100+
return (X) new java.sql.Date( instant.toEpochMilli() );
101101
}
102102

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

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

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -158,11 +158,11 @@ public <X> X unwrap(OffsetDateTime offsetDateTime, Class<X> type, WrapperOptions
158158
}
159159

160160
if ( java.sql.Date.class.isAssignableFrom( type ) ) {
161-
return (X) java.sql.Date.from( offsetDateTime.toInstant() );
161+
return (X) new java.sql.Date( offsetDateTime.toInstant().toEpochMilli() );
162162
}
163163

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

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

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

+4
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,10 @@ public <X> X unwrap(OffsetTime offsetTime, Class<X> type, WrapperOptions options
138138
return (X) Long.valueOf( instant.toEpochMilli() );
139139
}
140140

141+
if ( java.sql.Date.class.isAssignableFrom( type ) ) {
142+
throw new IllegalArgumentException( "Illegal attempt to treat `java.time.OffsetTime` as `java.sql.Date`" );
143+
}
144+
141145
if ( Date.class.isAssignableFrom( type ) ) {
142146
return (X) Date.from( instant );
143147
}

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -120,11 +120,11 @@ public <X> X unwrap(ZonedDateTime zonedDateTime, Class<X> type, WrapperOptions o
120120
}
121121

122122
if ( java.sql.Date.class.isAssignableFrom( type ) ) {
123-
return (X) java.sql.Date.from( zonedDateTime.toInstant() );
123+
return (X) new java.sql.Date( zonedDateTime.toInstant().toEpochMilli() );
124124
}
125125

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

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

0 commit comments

Comments
 (0)