Skip to content

Commit 5874eef

Browse files
committed
fix lots of NPEs in ProcedureParameterMetadataImpl
these could happen when no parameter was registered due to the optimization of lazily initializing the list of parameters
1 parent b918272 commit 5874eef

File tree

1 file changed

+29
-30
lines changed

1 file changed

+29
-30
lines changed

hibernate-core/src/main/java/org/hibernate/procedure/internal/ProcedureParameterMetadataImpl.java

Lines changed: 29 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
import org.hibernate.type.BindableType;
1919
import org.hibernate.query.QueryParameter;
2020
import org.hibernate.query.internal.QueryParameterBindingsImpl;
21-
import org.hibernate.procedure.ProcedureParameter;
2221
import org.hibernate.procedure.spi.ProcedureParameterImplementor;
2322
import org.hibernate.query.spi.ProcedureParameterMetadataImplementor;
2423
import org.hibernate.query.spi.QueryParameterBindings;
@@ -38,14 +37,6 @@ class ProcedureParameterMetadataImpl implements ProcedureParameterMetadataImplem
3837
private ParameterStrategy parameterStrategy = ParameterStrategy.UNKNOWN;
3938
private List<ProcedureParameterImplementor<?>> parameters;
4039

41-
ProcedureParameterMetadataImpl() {
42-
}
43-
44-
// public ProcedureParameterMetadataImpl(NamedCallableQueryMemento memento, SharedSessionContractImplementor session) {
45-
// memento.getParameterMementos()
46-
// .forEach( parameterMemento -> registerParameter( parameterMemento.resolve( session ) ) );
47-
// }
48-
4940
@Override
5041
public void registerParameter(ProcedureParameterImplementor<?> parameter) {
5142
if ( parameter.isNamed() ) {
@@ -98,17 +89,18 @@ public boolean hasPositionalParameters() {
9889

9990
@Override
10091
public Set<String> getNamedParameterNames() {
101-
if ( !hasNamedParameters() ) {
102-
return emptySet();
103-
}
104-
105-
final Set<String> rtn = new HashSet<>();
106-
for ( ProcedureParameter<?> parameter : parameters ) {
107-
if ( parameter.getName() != null ) {
108-
rtn.add( parameter.getName() );
92+
if ( hasNamedParameters() && parameters != null ) {
93+
final Set<String> names = new HashSet<>();
94+
for ( var parameter : parameters ) {
95+
if ( parameter.getName() != null ) {
96+
names.add( parameter.getName() );
97+
}
10998
}
99+
return names;
100+
}
101+
else {
102+
return emptySet();
110103
}
111-
return rtn;
112104
}
113105

114106
@Override
@@ -129,7 +121,7 @@ public ParameterStrategy getParameterStrategy() {
129121

130122
@Override
131123
public boolean hasAnyMatching(Predicate<QueryParameterImplementor<?>> filter) {
132-
if ( parameters.isEmpty() ) {
124+
if ( parameters == null || parameters.isEmpty() ) {
133125
return false;
134126
}
135127
else {
@@ -144,9 +136,11 @@ public boolean hasAnyMatching(Predicate<QueryParameterImplementor<?>> filter) {
144136

145137
@Override
146138
public ProcedureParameterImplementor<?> findQueryParameter(String name) {
147-
for ( var parameter : parameters ) {
148-
if ( name.equals( parameter.getName() ) ) {
149-
return parameter;
139+
if ( parameters != null ) {
140+
for ( var parameter : parameters ) {
141+
if ( name.equals( parameter.getName() ) ) {
142+
return parameter;
143+
}
150144
}
151145
}
152146
return null;
@@ -163,9 +157,12 @@ public ProcedureParameterImplementor<?> getQueryParameter(String name) {
163157

164158
@Override
165159
public ProcedureParameterImplementor<?> findQueryParameter(int positionLabel) {
166-
for ( var parameter : parameters ) {
167-
if ( parameter.getName() == null && positionLabel == parameter.getPosition() ) {
168-
return parameter;
160+
if ( parameters != null ) {
161+
for ( var parameter : parameters ) {
162+
if ( parameter.getName() == null
163+
&& positionLabel == parameter.getPosition() ) {
164+
return parameter;
165+
}
169166
}
170167
}
171168
return null;
@@ -174,18 +171,20 @@ public ProcedureParameterImplementor<?> findQueryParameter(int positionLabel) {
174171
@Override
175172
public ProcedureParameterImplementor<?> getQueryParameter(int positionLabel) {
176173
final var queryParameter = findQueryParameter( positionLabel );
177-
if ( queryParameter != null ) {
178-
return queryParameter;
174+
if ( queryParameter == null ) {
175+
throw new IllegalArgumentException(
176+
"Positional parameter " + positionLabel + " is not registered with this procedure call" );
179177
}
180-
throw new IllegalArgumentException( "Positional parameter [" + positionLabel + "] is not registered with this procedure call" );
178+
return queryParameter;
181179
}
182180

183181
@Override
184182
public <P> ProcedureParameterImplementor<P> resolve(Parameter<P> parameter) {
185-
if ( parameter instanceof ProcedureParameterImplementor<P> parameterImplementor ) {
183+
if ( parameters != null
184+
&& parameter instanceof ProcedureParameterImplementor<P> procedureParam ) {
186185
for ( var registered : parameters ) {
187186
if ( registered == parameter ) {
188-
return parameterImplementor;
187+
return procedureParam;
189188
}
190189
}
191190
}

0 commit comments

Comments
 (0)