Skip to content

Commit 1cd000c

Browse files
committed
HHH-17246 Handle UUID specially within JSON
1 parent 6056792 commit 1cd000c

File tree

6 files changed

+15
-50
lines changed

6 files changed

+15
-50
lines changed

hibernate-core/src/main/java/org/hibernate/dialect/OracleDialect.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,6 @@
8282
import org.hibernate.type.JavaObjectType;
8383
import org.hibernate.type.NullType;
8484
import org.hibernate.type.StandardBasicTypes;
85-
import org.hibernate.type.descriptor.java.OracleUUIDJavaType;
8685
import org.hibernate.type.descriptor.java.PrimitiveByteArrayJavaType;
8786
import org.hibernate.type.descriptor.jdbc.BlobJdbcType;
8887
import org.hibernate.type.descriptor.jdbc.JdbcType;
@@ -1042,8 +1041,6 @@ public void contributeTypes(TypeContributions typeContributions, ServiceRegistry
10421041
)
10431042
);
10441043

1045-
typeContributions.contributeJavaType( OracleUUIDJavaType.INSTANCE );
1046-
10471044
if(getVersion().isSameOrAfter(23)) {
10481045
final JdbcTypeRegistry jdbcTypeRegistry = typeContributions.getTypeConfiguration().getJdbcTypeRegistry();
10491046
jdbcTypeRegistry.addDescriptor(OracleEnumJdbcType.INSTANCE);

hibernate-core/src/main/java/org/hibernate/dialect/OracleUserDefinedTypeExporter.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import static org.hibernate.type.SqlTypes.TIMESTAMP_UTC;
2929
import static org.hibernate.type.SqlTypes.TIMESTAMP_WITH_TIMEZONE;
3030
import static org.hibernate.type.SqlTypes.TINYINT;
31+
import static org.hibernate.type.SqlTypes.UUID;
3132
import static org.hibernate.type.SqlTypes.VARBINARY;
3233

3334
/**
@@ -355,6 +356,8 @@ private String determineValueExpression(String expression, int elementSqlTypeCod
355356
case VARBINARY:
356357
case LONG32VARBINARY:
357358
return "hextoraw(" + expression + ")";
359+
case UUID:
360+
return "hextoraw(replace(" + expression + ",'-',''))";
358361
default:
359362
return expression;
360363
}

hibernate-core/src/main/java/org/hibernate/dialect/aggregate/OracleAggregateSupport.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,11 @@ public String aggregateComponentCustomReadExpression(
189189
placeholder,
190190
"hextoraw(json_value(" + parentPartExpression + columnExpression + "'))"
191191
);
192+
case UUID:
193+
return template.replace(
194+
placeholder,
195+
"hextoraw(replace(json_value(" + parentPartExpression + columnExpression + "'),'-',''))"
196+
);
192197
case CLOB:
193198
case NCLOB:
194199
case BLOB:
@@ -277,12 +282,16 @@ private String jsonCustomWriteExpression(
277282
switch ( sqlTypeCode ) {
278283
case CLOB:
279284
return "to_clob(" + customWriteExpression + ")";
285+
case UUID:
286+
return "regexp_replace(lower(rawtohex(" + customWriteExpression + ")),'^(.{8})(.{4})(.{4})(.{4})(.{12})$','\\1-\\2-\\3-\\4-\\5')";
280287
case ARRAY:
281288
final BasicPluralType<?, ?> pluralType = (BasicPluralType<?, ?>) jdbcMapping;
282289
final OracleArrayJdbcType jdbcType = (OracleArrayJdbcType) pluralType.getJdbcType();
283290
switch ( jdbcType.getElementJdbcType().getDefaultSqlTypeCode() ) {
284291
case CLOB:
285292
return "(select json_arrayagg(to_clob(t.column_value)) from table(" + customWriteExpression + ") t)";
293+
case UUID:
294+
return "(select json_arrayagg(regexp_replace(lower(rawtohex(t.column_value)),'^(.{8})(.{4})(.{4})(.{4})(.{12})$','\\1-\\2-\\3-\\4-\\5')) from table(" + customWriteExpression + ") t)";
286295
case BIT:
287296
return "decode(" + customWriteExpression + ",1,'true',0,'false',null)";
288297
case BOOLEAN:

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

Lines changed: 0 additions & 27 deletions
This file was deleted.

hibernate-core/src/test/java/org/hibernate/orm/test/id/uuid/SybaseASEUUIDTest.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,14 @@
66

77
import jakarta.persistence.Entity;
88
import jakarta.persistence.Id;
9-
import org.hibernate.annotations.JdbcType;
9+
import org.hibernate.annotations.JdbcTypeCode;
1010
import org.hibernate.dialect.SybaseASEDialect;
1111
import org.hibernate.testing.orm.junit.DomainModel;
1212
import org.hibernate.testing.orm.junit.JiraKey;
1313
import org.hibernate.testing.orm.junit.RequiresDialect;
1414
import org.hibernate.testing.orm.junit.SessionFactory;
1515
import org.hibernate.testing.orm.junit.SessionFactoryScope;
16+
import org.hibernate.type.SqlTypes;
1617
import org.junit.jupiter.api.AfterEach;
1718
import org.junit.jupiter.api.BeforeEach;
1819
import org.junit.jupiter.api.Test;
@@ -64,7 +65,7 @@ public void testTrailingZeroByteTruncation(SessionFactoryScope scope) {
6465
static class Book {
6566
@Id
6667
// The purpose is to effectively provoke the trailing 0 bytes truncation
67-
@JdbcType( SybaseUuidAsVarbinaryJdbcType.class )
68+
@JdbcTypeCode( SqlTypes.VARBINARY )
6869
UUID id;
6970

7071
String author;

hibernate-core/src/test/java/org/hibernate/orm/test/id/uuid/SybaseUuidAsVarbinaryJdbcType.java

Lines changed: 0 additions & 18 deletions
This file was deleted.

0 commit comments

Comments
 (0)