Skip to content

Commit 72261fd

Browse files
committed
HHH-18020 realign behavior of ClobJdbcType with BlobJdbcType
there was some organic divergence here
1 parent c955150 commit 72261fd

File tree

8 files changed

+122
-118
lines changed

8 files changed

+122
-118
lines changed

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/DB2LegacyDialect.java

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -876,12 +876,7 @@ public void contributeTypes(TypeContributions typeContributions, ServiceRegistry
876876
// Therefore here we overwrite the sql type descriptors to
877877
// use the non-N variants which are supported.
878878
jdbcTypeRegistry.addDescriptor( Types.NCHAR, CharJdbcType.INSTANCE );
879-
jdbcTypeRegistry.addDescriptor(
880-
Types.NCLOB,
881-
useInputStreamToInsertBlob()
882-
? ClobJdbcType.STREAM_BINDING
883-
: ClobJdbcType.CLOB_BINDING
884-
);
879+
jdbcTypeRegistry.addDescriptor( Types.NCLOB, ClobJdbcType.STREAM_BINDING );
885880
jdbcTypeRegistry.addDescriptor( Types.NVARCHAR, VarcharJdbcType.INSTANCE );
886881
jdbcTypeRegistry.addDescriptor( Types.NUMERIC, DecimalJdbcType.INSTANCE );
887882

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

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -958,12 +958,7 @@ public void contributeTypes(TypeContributions typeContributions, ServiceRegistry
958958
// Therefore here we overwrite the sql type descriptors to
959959
// use the non-N variants which are supported.
960960
jdbcTypeRegistry.addDescriptor( Types.NCHAR, CharJdbcType.INSTANCE );
961-
jdbcTypeRegistry.addDescriptor(
962-
Types.NCLOB,
963-
useInputStreamToInsertBlob()
964-
? ClobJdbcType.STREAM_BINDING
965-
: ClobJdbcType.CLOB_BINDING
966-
);
961+
jdbcTypeRegistry.addDescriptor( Types.NCLOB, ClobJdbcType.STREAM_BINDING );
967962
jdbcTypeRegistry.addDescriptor( Types.NVARCHAR, VarcharJdbcType.INSTANCE );
968963
jdbcTypeRegistry.addDescriptor( Types.NUMERIC, DecimalJdbcType.INSTANCE );
969964

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

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1688,13 +1688,6 @@ public void contributeTypes(TypeContributions typeContributions, ServiceRegistry
16881688
jdbcTypeRegistry.addDescriptor( NClobJdbcType.DEFAULT );
16891689
}
16901690

1691-
if ( useInputStreamToInsertBlob() ) {
1692-
jdbcTypeRegistry.addDescriptor(
1693-
Types.CLOB,
1694-
ClobJdbcType.STREAM_BINDING
1695-
);
1696-
}
1697-
16981691
if ( getTimeZoneSupport() == TimeZoneSupport.NATIVE ) {
16991692
jdbcTypeRegistry.addDescriptor( TimestampUtcAsOffsetDateTimeJdbcType.INSTANCE );
17001693
jdbcTypeRegistry.addDescriptor( TimeUtcAsOffsetTimeJdbcType.INSTANCE );

hibernate-core/src/main/java/org/hibernate/type/descriptor/jdbc/BlobJdbcType.java

Lines changed: 17 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -93,35 +93,32 @@ public Class<?> getPreferredJavaTypeClass(WrapperOptions options) {
9393
return byte[].class;
9494
}
9595

96+
private BlobJdbcType getDescriptor(Object value, WrapperOptions options) {
97+
if ( value instanceof byte[] ) {
98+
// performance shortcut for binding BLOB data in byte[] format
99+
return PRIMITIVE_ARRAY_BINDING;
100+
}
101+
else if ( options.useStreamForLobBinding() ) {
102+
return STREAM_BINDING;
103+
}
104+
else {
105+
return BLOB_BINDING;
106+
}
107+
}
108+
96109
@Override
97110
public <X> BasicBinder<X> getBlobBinder(final JavaType<X> javaType) {
98111
return new BasicBinder<>( javaType, this ) {
99112
@Override
100113
protected void doBind(PreparedStatement st, X value, int index, WrapperOptions options)
101114
throws SQLException {
102-
BlobJdbcType descriptor = BLOB_BINDING;
103-
if ( value instanceof byte[] ) {
104-
// performance shortcut for binding BLOB data in byte[] format
105-
descriptor = PRIMITIVE_ARRAY_BINDING;
106-
}
107-
else if ( options.useStreamForLobBinding() ) {
108-
descriptor = STREAM_BINDING;
109-
}
110-
descriptor.getBlobBinder( javaType ).doBind( st, value, index, options );
115+
getDescriptor( value, options ).getBlobBinder( javaType ).doBind( st, value, index, options );
111116
}
112117

113118
@Override
114119
protected void doBind(CallableStatement st, X value, String name, WrapperOptions options)
115120
throws SQLException {
116-
BlobJdbcType descriptor = BLOB_BINDING;
117-
if ( value instanceof byte[] ) {
118-
// performance shortcut for binding BLOB data in byte[] format
119-
descriptor = PRIMITIVE_ARRAY_BINDING;
120-
}
121-
else if ( options.useStreamForLobBinding() ) {
122-
descriptor = STREAM_BINDING;
123-
}
124-
descriptor.getBlobBinder( javaType ).doBind( st, value, name, options );
121+
getDescriptor( value, options ).getBlobBinder( javaType ).doBind( st, value, name, options );
125122
}
126123
};
127124
}
@@ -202,22 +199,14 @@ public <X> BasicBinder<X> getBlobBinder(final JavaType<X> javaType) {
202199
@Override
203200
protected void doBind(PreparedStatement st, X value, int index, WrapperOptions options)
204201
throws SQLException {
205-
final BinaryStream binaryStream = javaType.unwrap(
206-
value,
207-
BinaryStream.class,
208-
options
209-
);
202+
final BinaryStream binaryStream = javaType.unwrap( value, BinaryStream.class, options );
210203
st.setBinaryStream( index, binaryStream.getInputStream(), binaryStream.getLength() );
211204
}
212205

213206
@Override
214207
protected void doBind(CallableStatement st, X value, String name, WrapperOptions options)
215208
throws SQLException {
216-
final BinaryStream binaryStream = javaType.unwrap(
217-
value,
218-
BinaryStream.class,
219-
options
220-
);
209+
final BinaryStream binaryStream = javaType.unwrap( value, BinaryStream.class, options );
221210
st.setBinaryStream( name, binaryStream.getInputStream(), binaryStream.getLength() );
222211
}
223212
};

hibernate-core/src/main/java/org/hibernate/type/descriptor/jdbc/ClobJdbcType.java

Lines changed: 21 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@
1818
import org.hibernate.type.descriptor.ValueExtractor;
1919
import org.hibernate.type.descriptor.WrapperOptions;
2020
import org.hibernate.type.descriptor.java.JavaType;
21-
import org.hibernate.type.descriptor.jdbc.spi.JdbcTypeRegistry;
22-
import org.hibernate.type.spi.TypeConfiguration;
2321

2422
/**
2523
* Descriptor for {@link Types#CLOB CLOB} handling.
@@ -47,11 +45,8 @@ public String toString() {
4745
public JdbcType resolveIndicatedType(
4846
JdbcTypeIndicators indicators,
4947
JavaType<?> domainJtd) {
50-
final TypeConfiguration typeConfiguration = indicators.getTypeConfiguration();
51-
final JdbcTypeRegistry jdbcTypeRegistry = typeConfiguration.getJdbcTypeRegistry();
52-
return indicators.isNationalized()
53-
? jdbcTypeRegistry.getDescriptor( indicators.resolveJdbcTypeCode( Types.NCLOB ) )
54-
: jdbcTypeRegistry.getDescriptor( indicators.resolveJdbcTypeCode( Types.CLOB ) );
48+
final int jdbcTypeCode = indicators.resolveJdbcTypeCode( indicators.isNationalized() ? Types.NCLOB : Types.CLOB );
49+
return indicators.getTypeConfiguration().getJdbcTypeRegistry().getDescriptor( jdbcTypeCode );
5550
}
5651

5752
@Override
@@ -92,9 +87,20 @@ public String toString() {
9287

9388
@Override
9489
public Class<?> getPreferredJavaTypeClass(WrapperOptions options) {
95-
return options.useStreamForLobBinding() ?
96-
STREAM_BINDING.getPreferredJavaTypeClass( options ) :
97-
CLOB_BINDING.getPreferredJavaTypeClass( options );
90+
return String.class;
91+
}
92+
93+
private ClobJdbcType getDescriptor(Object value, WrapperOptions options) {
94+
if ( value instanceof String ) {
95+
// performance shortcut for binding CLOB data in String format
96+
return STRING_BINDING;
97+
}
98+
else if ( options.useStreamForLobBinding() ) {
99+
return STREAM_BINDING;
100+
}
101+
else {
102+
return CLOB_BINDING;
103+
}
98104
}
99105

100106
@Override
@@ -103,23 +109,13 @@ public <X> BasicBinder<X> getClobBinder(final JavaType<X> javaType) {
103109
@Override
104110
protected void doBind(PreparedStatement st, X value, int index, WrapperOptions options)
105111
throws SQLException {
106-
if ( options.useStreamForLobBinding() ) {
107-
STREAM_BINDING.getClobBinder( javaType ).doBind( st, value, index, options );
108-
}
109-
else {
110-
CLOB_BINDING.getClobBinder( javaType ).doBind( st, value, index, options );
111-
}
112+
getDescriptor( value, options ).getClobBinder( javaType ).doBind( st, value, index, options );
112113
}
113114

114115
@Override
115116
protected void doBind(CallableStatement st, X value, String name, WrapperOptions options)
116117
throws SQLException {
117-
if ( options.useStreamForLobBinding() ) {
118-
STREAM_BINDING.getClobBinder( javaType ).doBind( st, value, name, options );
119-
}
120-
else {
121-
CLOB_BINDING.getClobBinder( javaType ).doBind( st, value, name, options );
122-
}
118+
getDescriptor( value, options ).getClobBinder( javaType ).doBind( st, value, name, options );
123119
}
124120
};
125121
}
@@ -222,11 +218,7 @@ public <X> BasicBinder<X> getClobBinder(final JavaType<X> javaType) {
222218
@Override
223219
protected void doBind(PreparedStatement st, X value, int index, WrapperOptions options)
224220
throws SQLException {
225-
final CharacterStream characterStream = javaType.unwrap(
226-
value,
227-
CharacterStream.class,
228-
options
229-
);
221+
final CharacterStream characterStream = javaType.unwrap( value, CharacterStream.class, options );
230222
st.setCharacterStream( index, characterStream.asReader(), characterStream.getLength() );
231223
}
232224

@@ -261,22 +253,14 @@ public <X> BasicBinder<X> getClobBinder(final JavaType<X> javaType) {
261253
@Override
262254
protected void doBind(PreparedStatement st, X value, int index, WrapperOptions options)
263255
throws SQLException {
264-
final CharacterStream characterStream = javaType.unwrap(
265-
value,
266-
CharacterStream.class,
267-
options
268-
);
256+
final CharacterStream characterStream = javaType.unwrap( value, CharacterStream.class, options );
269257
st.setCharacterStream( index, characterStream.asReader(), characterStream.getLength() );
270258
}
271259

272260
@Override
273261
protected void doBind(CallableStatement st, X value, String name, WrapperOptions options)
274262
throws SQLException {
275-
final CharacterStream characterStream = javaType.unwrap(
276-
value,
277-
CharacterStream.class,
278-
options
279-
);
263+
final CharacterStream characterStream = javaType.unwrap( value, CharacterStream.class, options );
280264
st.setCharacterStream( name, characterStream.asReader(), characterStream.getLength() );
281265
}
282266
};

hibernate-core/src/main/java/org/hibernate/type/descriptor/jdbc/NClobJdbcType.java

Lines changed: 68 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -79,9 +79,49 @@ public String toString() {
7979

8080
@Override
8181
public Class<?> getPreferredJavaTypeClass(WrapperOptions options) {
82-
return options.useStreamForLobBinding() ?
83-
STREAM_BINDING.getPreferredJavaTypeClass( options ) :
84-
NCLOB_BINDING.getPreferredJavaTypeClass( options );
82+
return String.class;
83+
}
84+
85+
private NClobJdbcType getDescriptor(Object value, WrapperOptions options) {
86+
if ( value instanceof String ) {
87+
// performance shortcut for binding CLOB data in String format
88+
return STRING_BINDING;
89+
}
90+
else if ( options.useStreamForLobBinding() ) {
91+
return STREAM_BINDING;
92+
}
93+
else {
94+
return NCLOB_BINDING;
95+
}
96+
}
97+
98+
@Override
99+
public <X> BasicBinder<X> getNClobBinder(final JavaType<X> javaType) {
100+
return new BasicBinder<>( javaType, this ) {
101+
@Override
102+
protected void doBind(PreparedStatement st, X value, int index, WrapperOptions options)
103+
throws SQLException {
104+
getDescriptor( value, options ).getNClobBinder( javaType ).doBind( st, value, index, options );
105+
}
106+
107+
@Override
108+
protected void doBind(CallableStatement st, X value, String name, WrapperOptions options)
109+
throws SQLException {
110+
getDescriptor( value, options ).getNClobBinder( javaType ).doBind( st, value, name, options );
111+
}
112+
};
113+
}
114+
};
115+
116+
public static final NClobJdbcType STRING_BINDING = new NClobJdbcType() {
117+
@Override
118+
public String toString() {
119+
return "NClobTypeDescriptor(STRING_BINDING)";
120+
}
121+
122+
@Override
123+
public Class<?> getPreferredJavaTypeClass(WrapperOptions options) {
124+
return String.class;
85125
}
86126

87127
@Override
@@ -90,23 +130,34 @@ public <X> BasicBinder<X> getNClobBinder(final JavaType<X> javaType) {
90130
@Override
91131
protected void doBind(PreparedStatement st, X value, int index, WrapperOptions options)
92132
throws SQLException {
93-
if ( options.useStreamForLobBinding() ) {
94-
STREAM_BINDING.getNClobBinder( javaType ).doBind( st, value, index, options );
95-
}
96-
else {
97-
NCLOB_BINDING.getNClobBinder( javaType ).doBind( st, value, index, options );
98-
}
133+
st.setNString( index, javaType.unwrap( value, String.class, options ) );
99134
}
100135

101136
@Override
102137
protected void doBind(CallableStatement st, X value, String name, WrapperOptions options)
103138
throws SQLException {
104-
if ( options.useStreamForLobBinding() ) {
105-
STREAM_BINDING.getNClobBinder( javaType ).doBind( st, value, name, options );
106-
}
107-
else {
108-
NCLOB_BINDING.getNClobBinder( javaType ).doBind( st, value, name, options );
109-
}
139+
st.setNString( name, javaType.unwrap( value, String.class, options ) );
140+
}
141+
};
142+
}
143+
@Override
144+
public <X> ValueExtractor<X> getExtractor(final JavaType<X> javaType) {
145+
return new BasicExtractor<>( javaType, this ) {
146+
@Override
147+
protected X doExtract(ResultSet rs, int paramIndex, WrapperOptions options) throws SQLException {
148+
return javaType.wrap( rs.getNString( paramIndex ), options );
149+
}
150+
151+
@Override
152+
protected X doExtract(CallableStatement statement, int index, WrapperOptions options)
153+
throws SQLException {
154+
return javaType.wrap( statement.getNString( index ), options );
155+
}
156+
157+
@Override
158+
protected X doExtract(CallableStatement statement, String name, WrapperOptions options)
159+
throws SQLException {
160+
return javaType.wrap( statement.getNString( name ), options );
110161
}
111162
};
112163
}
@@ -158,22 +209,14 @@ public <X> BasicBinder<X> getNClobBinder(final JavaType<X> javaType) {
158209
@Override
159210
protected void doBind(PreparedStatement st, X value, int index, WrapperOptions options)
160211
throws SQLException {
161-
final CharacterStream characterStream = javaType.unwrap(
162-
value,
163-
CharacterStream.class,
164-
options
165-
);
212+
final CharacterStream characterStream = javaType.unwrap( value, CharacterStream.class, options );
166213
st.setNCharacterStream( index, characterStream.asReader(), characterStream.getLength() );
167214
}
168215

169216
@Override
170217
protected void doBind(CallableStatement st, X value, String name, WrapperOptions options)
171218
throws SQLException {
172-
final CharacterStream characterStream = javaType.unwrap(
173-
value,
174-
CharacterStream.class,
175-
options
176-
);
219+
final CharacterStream characterStream = javaType.unwrap( value, CharacterStream.class, options );
177220
st.setNCharacterStream( name, characterStream.asReader(), characterStream.getLength() );
178221
}
179222
};

hibernate-core/src/test/java/org/hibernate/orm/test/nationalized/MaterializedNClobBindTest.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,9 @@ else if ( "setNClob".equals( methodName ) ) {
164164
throw new IllegalStateException( "PreparedStatement#setNClob unexpectedly called" );
165165
}
166166
}
167+
else if ( "setNString".equals( methodName ) ) {
168+
return null;
169+
}
167170
else {
168171
throw new UnsupportedOperationException( methodName + " is not supported." );
169172

0 commit comments

Comments
 (0)