From 9ce2fa9cb46c7698e7b3928df743f0413e8a9e8d Mon Sep 17 00:00:00 2001 From: Christian Beikov Date: Wed, 24 Feb 2021 10:30:06 +0100 Subject: [PATCH] Fix check constraint generation --- .../java/BooleanTypeDescriptor.java | 30 ++++++++++++-- .../java/EnumJavaTypeDescriptor.java | 40 +++++++++++++------ 2 files changed, 53 insertions(+), 17 deletions(-) diff --git a/hibernate-core/src/main/java/org/hibernate/type/descriptor/java/BooleanTypeDescriptor.java b/hibernate-core/src/main/java/org/hibernate/type/descriptor/java/BooleanTypeDescriptor.java index f430511ed3..4832afcdfc 100644 --- a/hibernate-core/src/main/java/org/hibernate/type/descriptor/java/BooleanTypeDescriptor.java +++ b/hibernate-core/src/main/java/org/hibernate/type/descriptor/java/BooleanTypeDescriptor.java @@ -6,6 +6,8 @@ */ package org.hibernate.type.descriptor.java; +import java.sql.Types; + import org.hibernate.dialect.Dialect; import org.hibernate.type.descriptor.WrapperOptions; import org.hibernate.type.descriptor.java.spi.Primitive; @@ -69,7 +71,7 @@ public class BooleanTypeDescriptor extends AbstractClassTypeDescriptor return (X) toInteger( value ); } if ( Long.class.isAssignableFrom( type ) ) { - return (X) toInteger( value ); + return (X) toLong( value ); } if ( Character.class.isAssignableFrom( type ) ) { return (X) Character.valueOf( value ? characterValueTrue : characterValueFalse ); @@ -158,8 +160,28 @@ public class BooleanTypeDescriptor extends AbstractClassTypeDescriptor @Override public String getCheckCondition(String columnName, SqlTypeDescriptor sqlTypeDescriptor, Dialect dialect) { - return dialect.toBooleanValueString(true).equals("1") && !dialect.supportsBitType() - ? columnName + " in (0,1)" - : null; + switch ( sqlTypeDescriptor.getSqlType() ) { + case Types.CHAR: + case Types.VARCHAR: + case Types.LONGVARCHAR: + case Types.NCHAR: + case Types.NVARCHAR: + case Types.LONGNVARCHAR: + return columnName + " in ('" + characterValueFalse + "','" + characterValueTrue + "')"; + case Types.BIT: + case Types.SMALLINT: + case Types.TINYINT: + case Types.INTEGER: + case Types.BIGINT: + case Types.DOUBLE: + case Types.REAL: + case Types.FLOAT: + case Types.NUMERIC: + case Types.DECIMAL: + if ( !dialect.supportsBitType() ) { + return columnName + " in (0,1)"; + } + } + return null; } } diff --git a/hibernate-core/src/main/java/org/hibernate/type/descriptor/java/EnumJavaTypeDescriptor.java b/hibernate-core/src/main/java/org/hibernate/type/descriptor/java/EnumJavaTypeDescriptor.java index dfa714ba15..7c414fb4b4 100644 --- a/hibernate-core/src/main/java/org/hibernate/type/descriptor/java/EnumJavaTypeDescriptor.java +++ b/hibernate-core/src/main/java/org/hibernate/type/descriptor/java/EnumJavaTypeDescriptor.java @@ -218,20 +218,34 @@ public class EnumJavaTypeDescriptor> extends AbstractClassType @Override public String getCheckCondition(String columnName, SqlTypeDescriptor sqlTypeDescriptor, Dialect dialect) { - if (sqlTypeDescriptor instanceof TinyIntTypeDescriptor - || sqlTypeDescriptor instanceof IntegerTypeDescriptor) { - int last = getJavaTypeClass().getEnumConstants().length - 1; - return columnName + " between 0 and " + last; - } - else if (sqlTypeDescriptor instanceof VarcharTypeDescriptor) { - StringBuilder types = new StringBuilder(); - for ( Enum value : getJavaTypeClass().getEnumConstants() ) { - if (types.length() != 0) { - types.append(", "); + switch ( sqlTypeDescriptor.getSqlType() ) { + case Types.CHAR: + case Types.VARCHAR: + case Types.LONGVARCHAR: + case Types.NCHAR: + case Types.NVARCHAR: + case Types.LONGNVARCHAR: + final StringBuilder sb = new StringBuilder(); + sb.append( columnName ).append( " in (" ); + String separator = ""; + for ( Enum value : getJavaTypeClass().getEnumConstants() ) { + sb.append( separator ); + sb.append('\'').append( value.name() ).append('\''); + separator = ","; } - types.append("'").append( value.name() ).append("'"); - } - return columnName + " in (" + types + ")"; + return sb.append( ')' ).toString(); + case Types.BIT: + case Types.SMALLINT: + case Types.TINYINT: + case Types.INTEGER: + case Types.BIGINT: + case Types.DOUBLE: + case Types.REAL: + case Types.FLOAT: + case Types.NUMERIC: + case Types.DECIMAL: + int last = getJavaTypeClass().getEnumConstants().length - 1; + return columnName + " between 0 and " + last; } return null; }