All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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