Отображение нескольких параметров в mybatis mapper при вызове хранимой процедуры оракула из Java - PullRequest
1 голос
/ 27 марта 2019

Проблема в том, что я хочу вызвать хранимую процедуру из java, используя mybatis / ibatis, эта процедура имеет несколько параметров OUT, 7 точно, 2 из них - Numbers, остальные 5 Varchars плюс один параметр IN Number

Существует огромное ограничение внутри контекста, который не имеет моделей, только карты и списки, хотя мы можем сделать исключение при вызове процедур при необходимости. Кроме того, решение должно быть сделано в Java, не используется XML.

У меня есть приложение springboot, есть служба отдыха, которая вызывает компонент службы, который вызывает интерфейс Mapper, который определяет вызов процедуры, которую я пытаюсь выполнить.

До сих пор я пытался в интерфейсе mapper отображать результат в Object, List, Maps, используя @Result, пытаясь отобразить конкретное поле класса результата по полю, но все не удалось, miserabl ... mybatis, кажется, выполняет процедура без ошибок, но, к сожалению, ничего не возвращается.

Я публикую свое последнее состояние, которое состояло в попытке сопоставить результат с пользовательским классом, похоже, что процедура выполняется, но возвращается ноль

//custom class
public class ProcClass {
    Integer p_tipo_cliente;
    Integer p_codigo_cliente;
    String p_nombre_cliente;
    String p_cuit_cliente;
    String p_cuit_rp;
    String p_razon_social_rp;
    String p_domicilio;

// plus constructor, getters and setters
}

//Service method 
public ProcClass callProcedure(String param){
        return asociadoMapper.callProcedure(
                Integer.getInteger(param),0,0,
                "",",","","","");
    }


//Mapper interface

@Repository
public interface AsociadoMapper extends Mapper {


    @Select(value = AsociadoQueries.getDocumentoAsociadoCall)
    @Options(statementType = StatementType.CALLABLE)
    @Results(value = {
            @org.apache.ibatis.annotations.Result
                    (property = "p_tipo_cliente", column = "p_tipo_cliente"),
            @org.apache.ibatis.annotations.Result
                    (property = "p_codigo_cliente", column = "p_codigo_cliente"),
            @org.apache.ibatis.annotations.Result
                    (property = "p_nombre_cliente", column = "p_nombre_cliente"),
            @org.apache.ibatis.annotations.Result
                    (property = "p_cuit_cliente", column = "p_cuit_cliente"),
            @org.apache.ibatis.annotations.Result
                    (property = "p_cuit_rp", column = "p_cuit_rp"),
            @org.apache.ibatis.annotations.Result
                    (property = "p_razon_social_rp", column = "p_razon_social_rp"),
            @org.apache.ibatis.annotations.Result
                    (property = "p_domicilio", column = "p_domicilio"),
    })
    ProcClass callProcedure(Integer p_id_grupo_familiar,
                            Integer p_tipo_cliente,
                            Integer p_codigo_cliente,
                            String p_nombre_cliente,
                            String p_cuit_cliente,
                            String p_cuit_rp,
                            String p_razon_social_rp,
                            String p_domicilio
                                     );

//Util class

public class AsociadoQueries {


    public static final String getDocumentoAsociadoCall = "{ CALL consultas_generales.get_detalle_cliente_gf(" +
            "#{p_id_grupo_familiar, mode=IN, jdbcType=INTEGER}," +
            "#{p_tipo_cliente, mode=OUT, jdbcType=INTEGER,},"+
            "#{p_codigo_cliente,  jdbcType=INTEGER},"+
            "#{p_nombre_cliente,  jdbcType=VARCHAR},"+
            "#{p_cuit_cliente,  jdbcType=VARCHAR},"+
            "#{p_cuit_rp,  jdbcType=VARCHAR},"+
            "#{p_razon_social_rp,  jdbcType=VARCHAR},"+
            "#{p_domicilio, jdbcType=VARCHAR}"+
            ")}";


// Pom related dependencies

<!-- MySQL -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.0.0</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.0</version>
        </dependency>


        <!-- https://mvnrepository.com/artifact/org.mybatis.dynamic-sql/mybatis-dynamic-sql -->
        <dependency>
            <groupId>org.mybatis.dynamic-sql</groupId>
            <artifactId>mybatis-dynamic-sql</artifactId>
            <version>1.1.0</version>
        </dependency>

Ожидаемый результат прост: либо возвращение списка, карты или пользовательского класса, содержащего значения параметров OUT, возвращаемых процедурой, прямо сейчас, все, что я получил, было нулевым или пустым списком ...

1 Ответ

1 голос
/ 27 марта 2019

Ну да, мне просто удалось выяснить это, я думаю, мне нужно ответить самому себе, если это поможет кому-то еще ..., оказывается, мне наконец удалось получить параметры, отправив только 1 карту в качестве параметра, иустановка значений IN ранее в методе service ... также, теперь mapper возвращает void, что означает, что mybatis динамически добавляет все дополнительные выходные параметры в карту.Я также внес некоторые изменения в оператор вызова, возможно, там тоже была ошибка?

Код закончился так:

    //service call
    public Map<String, Object> callProcedure(String param){

            Map<String, Object> map = new HashMap<String, Object>();
            Integer privilegesCount = 0;
            map.put("p_id_grupo_familiar", Integer.valueOf(param));
            asociadoMapper.callProcedure(map);

            return map;
        }
    //mapper
        @Select(value = AsociadoQueries.getDocumentoAsociadoCall)
        @Options(statementType = StatementType.CALLABLE)
        void callProcedure(Map<String,Object> params);

// Call statement

public static final String getDocumentoAsociadoCall = "{ CALL consultas_generales.get_detalle_cliente_gf(" +
            "#{p_id_grupo_familiar,  jdbcType=NUMERIC ,javaType=java.lang.Integer ,mode=IN}," +
            "#{p_tipo_cliente, jdbcType=NUMERIC,javaType=java.lang.Integer ,mode=OUT,},"+
            "#{p_codigo_cliente,  jdbcType=NUMERIC ,javaType=java.lang.Integer ,mode=OUT},"+
            "#{p_nombre_cliente,  jdbcType=VARCHAR ,javaType=java.lang.String ,mode=OUT},"+
            "#{p_cuit_cliente,  jdbcType=VARCHAR ,javaType=java.lang.String ,mode=OUT},"+
            "#{p_cuit_rp,  jdbcType=VARCHAR ,javaType=java.lang.String ,mode=OUT},"+
            "#{p_razon_social_rp,  jdbcType=VARCHAR ,javaType=java.lang.String ,mode=OUT},"+
            "#{p_domicilio, jdbcType=VARCHAR ,javaType=java.lang.String ,mode=OUT}"+
            ")}";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...