From fc3c20f6692223adfee9f57d2a3f022f584d6895 Mon Sep 17 00:00:00 2001 From: Gavin King Date: Sat, 23 Jan 2021 13:23:03 +0100 Subject: [PATCH] remove BitTypeDescriptor --- .../dialect/AbstractHANADialect.java | 2 - .../org/hibernate/dialect/OracleDialect.java | 9 -- .../dialect/SybaseAnywhereDialect.java | 9 -- .../java/BooleanTypeDescriptor.java | 3 +- .../descriptor/sql/BitTypeDescriptor.java | 114 ------------------ .../descriptor/sql/BooleanTypeDescriptor.java | 1 + .../internal/SqlTypeDescriptorBaseline.java | 3 - ...ativeQueryResultTypeAutoDiscoveryTest.java | 103 +++++++++++++++- 8 files changed, 103 insertions(+), 141 deletions(-) delete mode 100644 hibernate-core/src/main/java/org/hibernate/type/descriptor/sql/BitTypeDescriptor.java diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/AbstractHANADialect.java b/hibernate-core/src/main/java/org/hibernate/dialect/AbstractHANADialect.java index 2a8c8f58a2..d1cff739a7 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/AbstractHANADialect.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/AbstractHANADialect.java @@ -1014,8 +1014,6 @@ protected SqlTypeDescriptor getSqlTypeDescriptorOverride(final int sqlCode) { case Types.TINYINT: // tinyint is unsigned on HANA return SmallIntTypeDescriptor.INSTANCE; - case Types.BOOLEAN: - return this.useLegacyBooleanType ? BitTypeDescriptor.INSTANCE : BooleanTypeDescriptor.INSTANCE; case Types.VARCHAR: return this.isUseUnicodeStringTypes() ? NVarcharTypeDescriptor.INSTANCE : VarcharTypeDescriptor.INSTANCE; case Types.CHAR: diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/OracleDialect.java b/hibernate-core/src/main/java/org/hibernate/dialect/OracleDialect.java index 4a6cca0082..84645927b6 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/OracleDialect.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/OracleDialect.java @@ -55,9 +55,7 @@ import org.hibernate.tool.schema.extract.internal.SequenceInformationExtractorOracleDatabaseImpl; import org.hibernate.tool.schema.extract.spi.SequenceInformationExtractor; import org.hibernate.type.StandardBasicTypes; -import org.hibernate.type.descriptor.sql.BitTypeDescriptor; import org.hibernate.type.descriptor.sql.BlobTypeDescriptor; -import org.hibernate.type.descriptor.sql.SqlTypeDescriptor; import java.sql.CallableStatement; import java.sql.ResultSet; @@ -597,13 +595,6 @@ public boolean supportsBitType() { return false; } - @Override - protected SqlTypeDescriptor getSqlTypeDescriptorOverride(int sqlCode) { - return sqlCode == Types.BOOLEAN - ? BitTypeDescriptor.INSTANCE - : super.getSqlTypeDescriptorOverride( sqlCode ); - } - @Override public void contributeTypes(TypeContributions typeContributions, ServiceRegistry serviceRegistry) { super.contributeTypes( typeContributions, serviceRegistry ); diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/SybaseAnywhereDialect.java b/hibernate-core/src/main/java/org/hibernate/dialect/SybaseAnywhereDialect.java index c47d0e904d..10e9dd626b 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/SybaseAnywhereDialect.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/SybaseAnywhereDialect.java @@ -18,8 +18,6 @@ import org.hibernate.sql.ast.spi.StandardSqlAstTranslatorFactory; import org.hibernate.sql.ast.tree.Statement; import org.hibernate.sql.exec.spi.JdbcOperation; -import org.hibernate.type.descriptor.sql.BitTypeDescriptor; -import org.hibernate.type.descriptor.sql.SqlTypeDescriptor; import java.sql.Types; @@ -78,13 +76,6 @@ public boolean supportsTimezoneTypes() { return true; } - @Override - protected SqlTypeDescriptor getSqlTypeDescriptorOverride(int sqlCode) { - return sqlCode == Types.BOOLEAN - ? BitTypeDescriptor.INSTANCE - : super.getSqlTypeDescriptorOverride( sqlCode ); - } - @Override public String currentDate() { return "current date"; 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 293dc1bb27..f430511ed3 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 @@ -9,7 +9,6 @@ import org.hibernate.dialect.Dialect; import org.hibernate.type.descriptor.WrapperOptions; import org.hibernate.type.descriptor.java.spi.Primitive; -import org.hibernate.type.descriptor.sql.BitTypeDescriptor; import org.hibernate.type.descriptor.sql.SqlTypeDescriptor; /** @@ -159,7 +158,7 @@ public int getDefaultSqlScale() { @Override public String getCheckCondition(String columnName, SqlTypeDescriptor sqlTypeDescriptor, Dialect dialect) { - return sqlTypeDescriptor instanceof BitTypeDescriptor && !dialect.supportsBitType() + return dialect.toBooleanValueString(true).equals("1") && !dialect.supportsBitType() ? columnName + " in (0,1)" : null; } diff --git a/hibernate-core/src/main/java/org/hibernate/type/descriptor/sql/BitTypeDescriptor.java b/hibernate-core/src/main/java/org/hibernate/type/descriptor/sql/BitTypeDescriptor.java deleted file mode 100644 index aef6db0db8..0000000000 --- a/hibernate-core/src/main/java/org/hibernate/type/descriptor/sql/BitTypeDescriptor.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Hibernate, Relational Persistence for Idiomatic Java - * - * License: GNU Lesser General Public License (LGPL), version 2.1 or later. - * See the lgpl.txt file in the root directory or . - */ -package org.hibernate.type.descriptor.sql; - -import java.sql.CallableStatement; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Types; - -import org.hibernate.dialect.Dialect; -import org.hibernate.type.descriptor.ValueBinder; -import org.hibernate.type.descriptor.ValueExtractor; -import org.hibernate.type.descriptor.WrapperOptions; -import org.hibernate.type.descriptor.java.BasicJavaDescriptor; -import org.hibernate.type.descriptor.java.JavaTypeDescriptor; -import org.hibernate.type.descriptor.sql.spi.BasicJdbcLiteralFormatter; -import org.hibernate.type.spi.TypeConfiguration; - -/** - * Descriptor for {@link Types#BIT BIT} handling. - *

- * Note that JDBC is very specific about its use of the type BIT to mean a single binary digit, whereas - * SQL defines BIT having a parameterized length. - * - * @author Steve Ebersole - */ -public class BitTypeDescriptor implements SqlTypeDescriptor { - public static final BitTypeDescriptor INSTANCE = new BitTypeDescriptor(); - - public BitTypeDescriptor() { - } - - public int getSqlType() { - return Types.BIT; - } - - @Override - public String getFriendlyName() { - return "BIT"; - } - - @Override - public String toString() { - return "BitTypeDescriptor"; - } - - @Override - public boolean canBeRemapped() { - return true; - } - - @Override - public BasicJavaDescriptor getJdbcRecommendedJavaTypeMapping(TypeConfiguration typeConfiguration) { - return (BasicJavaDescriptor) typeConfiguration.getJavaTypeDescriptorRegistry().getDescriptor( Boolean.class ); - } - - public JdbcLiteralFormatter getJdbcLiteralFormatter(JavaTypeDescriptor javaTypeDescriptor) { - if ( javaTypeDescriptor.getJavaTypeClass().equals(Boolean.class) ) { - //this is to allow literals to be formatted correctly when - //we are in the legacy Boolean-to-BIT JDBC type mapping mode - return new BasicJdbcLiteralFormatter( javaTypeDescriptor ) { - @Override - public String toJdbcLiteral(Object value, Dialect dialect, WrapperOptions wrapperOptions) { - Boolean bool = unwrap( value, Boolean.class, wrapperOptions ); - return bool ? "1" : "0"; - } - }; - } - else { - return (value, dialect, wrapperOptions) -> value.toString(); - } - } - - @Override - public ValueBinder getBinder(final JavaTypeDescriptor javaTypeDescriptor) { - return new BasicBinder( javaTypeDescriptor, this ) { - @Override - protected void doBind(PreparedStatement st, X value, int index, WrapperOptions options) throws SQLException { - st.setBoolean( index, javaTypeDescriptor.unwrap( value, Boolean.class, options ) ); - } - - @Override - protected void doBind(CallableStatement st, X value, String name, WrapperOptions options) - throws SQLException { - st.setBoolean( name, javaTypeDescriptor.unwrap( value, Boolean.class, options ) ); - } - }; - } - - @Override - public ValueExtractor getExtractor(final JavaTypeDescriptor javaTypeDescriptor) { - return new BasicExtractor( javaTypeDescriptor, this ) { - @Override - protected X doExtract(ResultSet rs, int paramIndex, WrapperOptions options) throws SQLException { - return javaTypeDescriptor.wrap( rs.getBoolean( paramIndex ), options ); - } - - @Override - protected X doExtract(CallableStatement statement, int index, WrapperOptions options) throws SQLException { - return javaTypeDescriptor.wrap( statement.getBoolean( index ), options ); - } - - @Override - protected X doExtract(CallableStatement statement, String name, WrapperOptions options) throws SQLException { - return javaTypeDescriptor.wrap( statement.getBoolean( name ), options ); - } - }; - } -} diff --git a/hibernate-core/src/main/java/org/hibernate/type/descriptor/sql/BooleanTypeDescriptor.java b/hibernate-core/src/main/java/org/hibernate/type/descriptor/sql/BooleanTypeDescriptor.java index 3e9a44c36d..b60d027784 100644 --- a/hibernate-core/src/main/java/org/hibernate/type/descriptor/sql/BooleanTypeDescriptor.java +++ b/hibernate-core/src/main/java/org/hibernate/type/descriptor/sql/BooleanTypeDescriptor.java @@ -12,6 +12,7 @@ import java.sql.SQLException; import java.sql.Types; +import org.hibernate.dialect.Dialect; import org.hibernate.type.descriptor.ValueBinder; import org.hibernate.type.descriptor.ValueExtractor; import org.hibernate.type.descriptor.WrapperOptions; diff --git a/hibernate-core/src/main/java/org/hibernate/type/descriptor/sql/internal/SqlTypeDescriptorBaseline.java b/hibernate-core/src/main/java/org/hibernate/type/descriptor/sql/internal/SqlTypeDescriptorBaseline.java index b59e2fbfe0..0d6131b153 100644 --- a/hibernate-core/src/main/java/org/hibernate/type/descriptor/sql/internal/SqlTypeDescriptorBaseline.java +++ b/hibernate-core/src/main/java/org/hibernate/type/descriptor/sql/internal/SqlTypeDescriptorBaseline.java @@ -8,7 +8,6 @@ import org.hibernate.type.descriptor.sql.BigIntTypeDescriptor; import org.hibernate.type.descriptor.sql.BinaryTypeDescriptor; -import org.hibernate.type.descriptor.sql.BitTypeDescriptor; import org.hibernate.type.descriptor.sql.BlobTypeDescriptor; import org.hibernate.type.descriptor.sql.BooleanTypeDescriptor; import org.hibernate.type.descriptor.sql.CharTypeDescriptor; @@ -46,8 +45,6 @@ public interface BaselineTarget { public static void prime(BaselineTarget target) { target.addDescriptor( BooleanTypeDescriptor .INSTANCE ); - - target.addDescriptor( BitTypeDescriptor.INSTANCE ); target.addDescriptor( BigIntTypeDescriptor.INSTANCE ); target.addDescriptor( DecimalTypeDescriptor.INSTANCE ); target.addDescriptor( DoubleTypeDescriptor.INSTANCE ); diff --git a/hibernate-core/src/test/java/org/hibernate/jpa/test/query/NativeQueryResultTypeAutoDiscoveryTest.java b/hibernate-core/src/test/java/org/hibernate/jpa/test/query/NativeQueryResultTypeAutoDiscoveryTest.java index d15d2d0395..c1e9ea9353 100644 --- a/hibernate-core/src/test/java/org/hibernate/jpa/test/query/NativeQueryResultTypeAutoDiscoveryTest.java +++ b/hibernate-core/src/test/java/org/hibernate/jpa/test/query/NativeQueryResultTypeAutoDiscoveryTest.java @@ -8,15 +8,19 @@ import java.math.BigDecimal; import java.sql.Blob; +import java.sql.CallableStatement; import java.sql.Clob; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; import java.sql.Time; import java.sql.Timestamp; +import java.sql.Types; import java.time.Month; import java.time.ZoneId; import java.time.ZonedDateTime; import java.util.Arrays; import java.util.HashMap; -import java.util.List; import java.util.Map; import java.util.function.Function; import javax.persistence.Column; @@ -40,14 +44,21 @@ import org.hibernate.jpa.boot.spi.Bootstrap; import org.hibernate.jpa.test.PersistenceUnitDescriptorAdapter; import org.hibernate.type.AbstractSingleColumnStandardBasicType; +import org.hibernate.type.descriptor.ValueBinder; +import org.hibernate.type.descriptor.ValueExtractor; +import org.hibernate.type.descriptor.WrapperOptions; +import org.hibernate.type.descriptor.java.BasicJavaDescriptor; import org.hibernate.type.descriptor.java.BigDecimalTypeDescriptor; import org.hibernate.type.descriptor.java.BooleanTypeDescriptor; import org.hibernate.type.descriptor.java.FloatTypeDescriptor; +import org.hibernate.type.descriptor.java.JavaTypeDescriptor; import org.hibernate.type.descriptor.java.PrimitiveByteArrayTypeDescriptor; import org.hibernate.type.descriptor.java.StringTypeDescriptor; +import org.hibernate.type.descriptor.sql.BasicBinder; +import org.hibernate.type.descriptor.sql.BasicExtractor; import org.hibernate.type.descriptor.sql.BinaryTypeDescriptor; -import org.hibernate.type.descriptor.sql.BitTypeDescriptor; import org.hibernate.type.descriptor.sql.CharTypeDescriptor; +import org.hibernate.type.descriptor.sql.JdbcLiteralFormatter; import org.hibernate.type.descriptor.sql.NumericTypeDescriptor; import org.hibernate.testing.RequiresDialect; @@ -55,6 +66,9 @@ import org.hibernate.testing.TestForIssue; import org.hibernate.testing.junit4.CustomRunner; import org.hibernate.testing.transaction.TransactionUtil; +import org.hibernate.type.descriptor.sql.SqlTypeDescriptor; +import org.hibernate.type.descriptor.sql.spi.BasicJdbcLiteralFormatter; +import org.hibernate.type.spi.TypeConfiguration; import org.junit.After; import org.junit.Assert; import org.junit.Test; @@ -594,3 +608,88 @@ public String getName() { } } + +class BitTypeDescriptor implements SqlTypeDescriptor { + public static final BitTypeDescriptor INSTANCE = new BitTypeDescriptor(); + + public BitTypeDescriptor() { + } + + public int getSqlType() { + return Types.BIT; + } + + @Override + public String getFriendlyName() { + return "BIT"; + } + + @Override + public String toString() { + return "BitTypeDescriptor"; + } + + @Override + public boolean canBeRemapped() { + return true; + } + + @Override + public BasicJavaDescriptor getJdbcRecommendedJavaTypeMapping(TypeConfiguration typeConfiguration) { + return (BasicJavaDescriptor) typeConfiguration.getJavaTypeDescriptorRegistry().getDescriptor( Boolean.class ); + } + + public JdbcLiteralFormatter getJdbcLiteralFormatter(JavaTypeDescriptor javaTypeDescriptor) { + if ( javaTypeDescriptor.getJavaType().equals(Boolean.class) ) { + //this is to allow literals to be formatted correctly when + //we are in the legacy Boolean-to-BIT JDBC type mapping mode + return new BasicJdbcLiteralFormatter( javaTypeDescriptor ) { + @Override + public String toJdbcLiteral(Object value, Dialect dialect, WrapperOptions wrapperOptions) { + Boolean bool = unwrap( value, Boolean.class, wrapperOptions ); + return bool ? "1" : "0"; + } + }; + } + else { + return (value, dialect, wrapperOptions) -> value.toString(); + } + } + + @Override + public ValueBinder getBinder(final JavaTypeDescriptor javaTypeDescriptor) { + return new BasicBinder( javaTypeDescriptor, this ) { + @Override + protected void doBind(PreparedStatement st, X value, int index, WrapperOptions options) throws SQLException { + st.setBoolean( index, javaTypeDescriptor.unwrap( value, Boolean.class, options ) ); + } + + @Override + protected void doBind(CallableStatement st, X value, String name, WrapperOptions options) + throws SQLException { + st.setBoolean( name, javaTypeDescriptor.unwrap( value, Boolean.class, options ) ); + } + }; + } + + @Override + public ValueExtractor getExtractor(final JavaTypeDescriptor javaTypeDescriptor) { + return new BasicExtractor( javaTypeDescriptor, this ) { + @Override + protected X doExtract(ResultSet rs, int paramIndex, WrapperOptions options) throws SQLException { + return javaTypeDescriptor.wrap( rs.getBoolean( paramIndex ), options ); + } + + @Override + protected X doExtract(CallableStatement statement, int index, WrapperOptions options) throws SQLException { + return javaTypeDescriptor.wrap( statement.getBoolean( index ), options ); + } + + @Override + protected X doExtract(CallableStatement statement, String name, WrapperOptions options) throws SQLException { + return javaTypeDescriptor.wrap( statement.getBoolean( name ), options ); + } + }; + } +} +