Универсальная оболочка для пружинной процедуры - PullRequest
1 голос
/ 27 сентября 2019

Я создал несколько реализаций хранимых процедур (PostgreSQL) с использованием Spring, как показано ниже.Код работает нормально

import com.ebooks.domain.BaseBookDto;
import org.springframework.stereotype.Repository;

import javax.persistence.EntityManager;
import javax.persistence.NamedStoredProcedureQuery;
import javax.persistence.ParameterMode;
import javax.persistence.PersistenceContext;
import javax.persistence.StoredProcedureParameter;
import javax.persistence.StoredProcedureQuery;
import java.io.Serializable;

@Repository
@NamedStoredProcedureQuery(
        name = "register_book",
        procedureName = "register_book",
        parameters = {
                @StoredProcedureParameter(mode = ParameterMode.IN, type = String.class, name = "p_title"),
                @StoredProcedureParameter(mode = ParameterMode.IN, type = String.class, name = "p_image_url"),
                @StoredProcedureParameter(mode = ParameterMode.IN, type = String.class, name = "p_description"),
                @StoredProcedureParameter(mode = ParameterMode.IN, type = Integer.class, name = "p_category_id"),
                @StoredProcedureParameter(mode = ParameterMode.IN, type = Integer.class, name = "p_quantity")
        }
)
public class AddBookProc implements Serializable {

    @PersistenceContext
    private EntityManager manager;

    public boolean addNewBook(BaseBookDto bookDetails) {
        try
        {
            StoredProcedureQuery query = manager.createStoredProcedureQuery("register_book")
                    .registerStoredProcedureParameter(0 , String.class , ParameterMode.IN)
                    .registerStoredProcedureParameter(1 , String.class, ParameterMode.IN)
                    .registerStoredProcedureParameter(2 , String.class, ParameterMode.IN)
                    .registerStoredProcedureParameter(3 , Integer.class, ParameterMode.IN)
                    .registerStoredProcedureParameter(4 , Integer.class, ParameterMode.IN);

            query.setParameter(0, bookDetails.getTitle())
                 .setParameter(1, bookDetails.getImageUrl())
                 .setParameter(2, bookDetails.getDescription())
                 .setParameter(3, bookDetails.getCategoryId())
                 .setParameter(4, bookDetails.getQuantity());

            query.execute();
        }
        catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }
}

Одна проблема, которая возникла у меня, заключается в том, что если у нас есть 20-30 хранимых процедур, мне нужно создать эти 20-30 реализаций, как показано ниже.Одна мысль, которая пришла мне в голову, состоит в том, что мы можем создать универсальную оболочку для показанной выше реализации, как показано ниже

public interface BookDao {

    @SpocQuery("register_book")
    boolean addNewBook(String title, String imageUrl, String description, Integer categoryId, Integer quantity) throws SQLException;

    @SpocQuery("get_books_list")
    List<Book> getBookList() throws SQLException;

    :
    :
}

Если это возможно, может кто-нибудь дать мне несколько идей, как этого достичь

...