From f538386e8678d87ad3f151008df5fd369fa59952 Mon Sep 17 00:00:00 2001 From: Valentin Kovalenko Date: Mon, 14 Jul 2025 17:16:33 -0600 Subject: [PATCH] Throw `SQLFeatureNotSupportedException` when we encounter unexpected data instead of throwing `AssertionError` HIBERNATE-58 --- .../internal/type/MongoStructJdbcType.java | 4 +-- .../internal/type/ValueConversions.java | 28 +++++++++++-------- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/mongodb/hibernate/internal/type/MongoStructJdbcType.java b/src/main/java/com/mongodb/hibernate/internal/type/MongoStructJdbcType.java index f51f0031..362403ca 100644 --- a/src/main/java/com/mongodb/hibernate/internal/type/MongoStructJdbcType.java +++ b/src/main/java/com/mongodb/hibernate/internal/type/MongoStructJdbcType.java @@ -101,8 +101,8 @@ public EmbeddableMappingType getEmbeddableMappingType() { } /** - * We replaced this method with {@link #createBsonValue(Object, WrapperOptions)} to make it clear that - * {@link #createJdbcValue(Object, WrapperOptions)} is not called by Hibernate ORM. + * We replaced this method with {@link #createBsonValue(Object, WrapperOptions)}, to make it clear that this method + * is not called by Hibernate ORM. */ @Override public BsonValue createJdbcValue(@Nullable Object domainValue, WrapperOptions options) { diff --git a/src/main/java/com/mongodb/hibernate/internal/type/ValueConversions.java b/src/main/java/com/mongodb/hibernate/internal/type/ValueConversions.java index 692103e3..128d09c4 100644 --- a/src/main/java/com/mongodb/hibernate/internal/type/ValueConversions.java +++ b/src/main/java/com/mongodb/hibernate/internal/type/ValueConversions.java @@ -186,11 +186,7 @@ static Object toDomainValue(BsonValue value, Class domainType) throws SQLFeat } else if (value instanceof BsonDecimal128 v) { return toDomainValue(v); } else if (value instanceof BsonString v) { - if (domainType.isArray()) { - return toDomainValue(v); - } else { - return toDomainValue(v, domainType); - } + return toDomainValue(v, domainType); } else if (value instanceof BsonBinary v) { return toDomainValue(v); } else if (value instanceof BsonObjectId v) { @@ -251,17 +247,25 @@ private static BigDecimal toDomainValue(BsonDecimal128 value) { return value.decimal128Value().bigDecimalValue(); } - public static String toStringDomainValue(BsonValue value) { + public static String toStringDomainValue(BsonValue value) throws SQLFeatureNotSupportedException { return toDomainValue(value.asString(), String.class); } - private static T toDomainValue(BsonString value, Class domainType) { - var v = value.getValue(); + private static T toDomainValue(BsonString value, Class domainType) throws SQLFeatureNotSupportedException { Object result; - if (domainType.equals(Character.class)) { - result = toDomainValue(v); + if (domainType.equals(char[].class)) { + result = toDomainValue(value); } else { - result = v; + var v = value.getValue(); + if (domainType.equals(Character.class) && v.length() == 1) { + result = toDomainValue(v); + } else if (domainType.equals(String.class) || domainType.equals(Object.class)) { + result = v; + } else { + throw new SQLFeatureNotSupportedException(format( + "Value [%s] of type [%s] is not supported for the domain type [%s]", + value, value.getClass().getTypeName(), domainType)); + } } return domainType.cast(result); } @@ -306,7 +310,7 @@ private static Object toDomainValue(BsonArray value, Class elementType) throw } /** @see #toBsonValue(char[]) */ - private static char[] toDomainValue(BsonString value) { + private static char[] toDomainValue(BsonString value) throws SQLFeatureNotSupportedException { return toDomainValue(value, String.class).toCharArray(); } }