
com.infobip.spring.data.jpa.StoredProcedureQueryBuilder Maven / Gradle / Ivy
package com.infobip.spring.data.jpa;
import com.querydsl.core.types.Path;
import javax.persistence.*;
import java.util.*;
public class StoredProcedureQueryBuilder {
private final String name;
private final List inParameters;
private final EntityManager entityManager;
private Class>[] resultClasses;
StoredProcedureQueryBuilder(String name,
EntityManager entityManager) {
this.name = name;
this.entityManager = entityManager;
this.inParameters = new ArrayList<>();
}
@SuppressWarnings("unchecked")
public List getResultList() {
return build().getResultList();
}
public StoredProcedureQuery build() {
StoredProcedureQuery storedProcedureQuery = createStoredProcedureQuery();
inParameters.forEach(parameter -> {
storedProcedureQuery.registerStoredProcedureParameter(parameter.name, parameter.type, ParameterMode.IN);
storedProcedureQuery.setParameter(parameter.name, parameter.value);
});
return storedProcedureQuery;
}
private StoredProcedureQuery createStoredProcedureQuery() {
if(resultClasses == null) {
return entityManager.createStoredProcedureQuery(name);
}
return entityManager.createStoredProcedureQuery(name, resultClasses);
}
public StoredProcedureQueryBuilder addInParameter(Path parameter, T value) {
Class> type = parameter.getType();
inParameters.add(new Parameter(type, parameter.getMetadata().getName(), value));
return this;
}
public StoredProcedureQueryBuilder addInParameter(String name, Object value) {
inParameters.add(new Parameter(value.getClass(), name, value));
return this;
}
public StoredProcedureQueryBuilder setResultClasses(Class>... resultClasses) {
this.resultClasses = resultClasses;
return this;
}
private static final class Parameter {
private final Class> type;
private final String name;
private final Object value;
private Parameter(Class> type, String name, Object value) {
this.type = type;
this.name = name;
this.value = value;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
Parameter parameter = (Parameter) o;
return Objects.equals(type, parameter.type) &&
Objects.equals(name, parameter.name) &&
Objects.equals(value, parameter.value);
}
@Override
public int hashCode() {
return Objects.hash(type, name, value);
}
@Override
public String toString() {
return "Parameter{" +
"type=" + type +
", name='" + name + '\'' +
", value=" + value +
'}';
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy