diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/produce/function/internal/PatternRenderer.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/produce/function/internal/PatternRenderer.java index 1d66b15d270c..bb14a6d012b7 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/produce/function/internal/PatternRenderer.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/produce/function/internal/PatternRenderer.java @@ -96,7 +96,7 @@ else if ( c == '?' ) { vararg = paramList.size(); } else { - final int paramNumber = parseInt( index.toString() ); + final int paramNumber = parameterIndex( pattern, index.toString() ); paramList.add( paramNumber ); index.setLength(0); if ( paramNumber > max ) { @@ -126,6 +126,21 @@ else if ( c == '?' ) { this.argumentRenderingModes = argumentRenderingModes; } + private static int parameterIndex(String pattern, String index) { + if ( index.isEmpty() ) { + throw new IllegalArgumentException( "Missing parameter index in pattern: '" + pattern + "'" ); + } + final int paramNumber; + try { + paramNumber = parseInt( index ); + } + catch (NumberFormatException nfe) { + throw new IllegalArgumentException( "Illegal parameter index '" + index + + "' in pattern: '" + pattern + "'", nfe ); + } + return paramNumber; + } + public boolean hasVarargs() { return varargParam >= 0; }