hibernate/hibernate-orm · error · CoercionException
Cannot coerce value ' ' [ ] to Double
Error message
Cannot coerce value '%s' [%s] to Double
What it means
DoubleJavaType.coerce(Object) is Hibernate's last-chance conversion of an arbitrary value to Double for double-typed attributes and query parameters: it delegates to coerceOrNull and throws CoercionException('Cannot coerce value ... to Double'), naming the offending value and its class, when no coercion rule matched and coerceOrNull returned null.
Solutions
- Convert the value to Double yourself before binding: Double.parseDouble on a normalized string, or ((Number) v).doubleValue()
- Fix the producer: parse with the correct Locale, trim blanks, normalize decimal separators
- Type the parameter explicitly with setParameter(name, value, type) so coercion is not guessed
- Catch CoercionException at the API boundary and return a validation error
Example fix
// before
q.setParameter("rate", map.get("rate")); // value is String "3,5" -> CoercionException
// after
q.setParameter("rate", Double.parseDouble(map.get("rate").toString().replace(',', '.'))); Defensive patterns
Strategy: type-guard
Validate before calling
static Double toDoubleOrNull(Object v) {
try {
return v instanceof Number n ? n.doubleValue()
: Double.parseDouble(String.valueOf(v).trim());
} catch (RuntimeException e) {
return null;
}
} Type guard
static boolean coercibleToDouble(Object v) {
if (v == null || v instanceof Number || v instanceof Boolean) return true;
return v instanceof String s && s.trim().matches("[+-]?([0-9]+(\\.[0-9]*)?|\\.[0-9]+)([eE][+-]?[0-9]+)?");
} Try / catch
try {
return q.setParameter("rate", value).getSingleResult();
} catch (CoercionException e) {
throw new BadRequestException("rate must be numeric", e);
} Prevention
- Convert web/JSON input to the target numeric type before Hibernate sees it
- Avoid locale-sensitive number parsing in request handlers
- Pass explicit types on native query parameters
When it happens
Trigger: Binding a query parameter or setting a double-typed attribute with a value Hibernate cannot convert: a non-numeric or locale-formatted String ('abc', '', '1,5'), or an arbitrary object type (java.util.Date, a POJO, char[]) that the numeric coercion helper does not know.
Common situations: HQL/native setParameter with user input parsed as the wrong type; JSON deserialization straight onto entities; consuming Map<String,Object> rows; locale-formatted numbers from European formats.
Related errors
- Cannot coerce value ' ' [ ] to Float
- Cannot coerce value ' ' [ ] to Integer
- Cannot coerce Double value
- Cannot coerce Double value
- Cannot coerce Double value
AI-assisted analysis of hibernate/hibernate-orm@fad1729dce (2026-08-22).
Data as JSON: /api/errors/c7f92873d66233b4.
Report an issue: GitHub.
Appendix: source
Thrown at hibernate-core/src/main/java/org/hibernate/type/descriptor/java/DoubleJavaType.java:175
@Override
public int getDefaultSqlPrecision(Dialect dialect, JdbcType jdbcType) {
return jdbcType.isFloat()
// this is usually the number of *binary* digits
// in a double-precision FP number
? dialect.getDoublePrecision()
// this is the number of decimal digits in a Java double
: 17;
}
@Override
public @Nullable Double coerce(@Nullable Object value) {
if ( value == null ) {
return null;
}
final var coerced = coerceOrNull( value );
if ( coerced == null ) {
throw new CoercionException(
String.format(
Locale.ROOT,
"Cannot coerce value '%s' [%s] to Double",
value,
value.getClass().getName()
)
);
}
return coerced;
}
@Override
public @Nullable Double coerceOrNull(@Nonnull Object value) {
if ( value instanceof Double doubleValue ) {
return doubleValue;
}
if ( value instanceof Float floatValue ) {View on GitHub (pinned to fad1729dce)