Skip to content

Commit 59a5a88

Browse files
committed
HHH-9343 - Case/when in criteria with string literal result fails type checking
1 parent c040cb6 commit 59a5a88

File tree

2 files changed

+27
-0
lines changed

2 files changed

+27
-0
lines changed

hibernate-entitymanager/src/main/java/org/hibernate/jpa/criteria/ValueHandlerFactory.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,10 @@ public static boolean isNumeric(Object value) {
6868
|| Double.TYPE.isInstance( value );
6969
}
7070

71+
public static boolean isBoolean(Object value) {
72+
return Boolean.class.isInstance( value );
73+
}
74+
7175
public static class ByteValueHandler extends BaseValueHandler<Byte> implements Serializable {
7276
public static final ByteValueHandler INSTANCE = new ByteValueHandler();
7377
@SuppressWarnings({ "UnnecessaryBoxing" })
@@ -230,6 +234,23 @@ public String render(BigDecimal value) {
230234
}
231235
}
232236

237+
public static class BooleanValueHandler extends BaseValueHandler<Boolean> implements Serializable {
238+
public static final BooleanValueHandler INSTANCE = new BooleanValueHandler();
239+
240+
public Boolean convert(Object value) {
241+
if ( value == null ) {
242+
return null;
243+
}
244+
if ( Boolean.class.isInstance( value ) ) {
245+
return (Boolean) value;
246+
}
247+
if ( String.class.isInstance( value ) ) {
248+
return Boolean.getBoolean( (String) value );
249+
}
250+
throw unknownConversion( value, Boolean.class );
251+
}
252+
}
253+
233254
public static class StringValueHandler extends BaseValueHandler<String> implements Serializable {
234255
public static final StringValueHandler INSTANCE = new StringValueHandler();
235256
public String convert(Object value) {
@@ -308,6 +329,9 @@ public static <T> ValueHandler<T> determineAppropriateHandler(Class<T> targetTyp
308329
if ( BigDecimal.class.equals( targetType ) ) {
309330
return (ValueHandler<T>) BigDecimalValueHandler.INSTANCE;
310331
}
332+
if ( Boolean.class.equals( targetType ) ) {
333+
return (ValueHandler<T>) BooleanValueHandler.INSTANCE;
334+
}
311335
return null;
312336
}
313337
}

hibernate-entitymanager/src/main/java/org/hibernate/jpa/criteria/expression/LiteralExpression.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,9 @@ public String render(RenderingContext renderingContext) {
4949
if ( ValueHandlerFactory.isNumeric( literal ) ) {
5050
return ValueHandlerFactory.determineAppropriateHandler( (Class) literal.getClass() ).render( literal );
5151
}
52+
else if ( ValueHandlerFactory.isBoolean( literal ) ) {
53+
return ValueHandlerFactory.determineAppropriateHandler( (Class) literal.getClass() ).render( literal );
54+
}
5255

5356
// else...
5457
final String parameterName = renderingContext.registerLiteralParameterBinding( getLiteral(), getJavaType() );

0 commit comments

Comments
 (0)