如何将对象列表(DTO)作为单个IN参数传递给存储过程

问题描述 投票:3回答:2

我想在参数中传递Dto并在spring jdbc中调用存储过程。这有可能,这样做吗?

我想用dto调用存储过程作为参数而不是设置参数?因为我有大量的参数。

mysql stored-procedures spring-jdbc dto
2个回答
8
投票

目前,没有办法在MySQL存储过程和函数中传递(或返回)对象。

但是,MySQL 5.7具有JSON函数,您可以传递varchar参数并使用JSON_EXTRACT函数提取值。

请参阅MySQL 5.7手册:Functions That Search JSON Values


0
投票

我能够在MySQL 5.7中做到这一点

如果你试图改变要查找的键,我会这样做

SET TypeCat = CONCAT(CONVERT('$.', CHAR(50)), T)

之所以是Mysql认为'$.'是双倍的,所以我不得不把它作为Char

DROP PROCEDURE IF EXISTS web.newTransaction;

CREATE PROCEDURE web.newTransaction (DATA JSON)
  BEGIN


  ## Declare Vars ###
  DECLARE done INT DEFAULT FALSE;

  DECLARE TypeCat VARCHAR(255);

  DECLARE s JSON;

  # CURSOR 1
  DECLARE T VARCHAR(255);   ## Transaction
  DECLARE TVT VARCHAR(255); ## TransactionValueTable
  DECLARE cur1 CURSOR FOR SELECT  Transaction, TransactionValueTable FROM  web.TransactionType;




  ##### Error Handlers ####

  ### Error Handle for Loop ##

  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=TRUE;

  DECLARE exit handler for sqlexception
    BEGIN
      -- ERROR
      SHOW ERRORS;
    ROLLBACK;
  END;

  DECLARE exit handler for sqlwarning
   BEGIN
      -- WARNING
     SHOW WARNINGS;
   ROLLBACK;
  END;



  OPEN cur1;

  START TRANSACTION;
  -- Start our for loop
  forLoop: LOOP

      FETCH cur1 INTO T,TVT;
      IF done = TRUE THEN
        LEAVE forLoop;
      END IF;

      SET TypeCat = CONCAT(CONVERT('$.', CHAR(50)), T);


      IF (SELECT JSON_CONTAINS_PATH(DATA, 'one',  TypeCat) = 1)
      THEN SET s =JSON_EXTRACT(DATA, TypeCat);
      END IF;



    -- End our for loop
    END LOOP forLoop;


  COMMIT;

    SELECT s;
END;

call web.newTransaction('{"Owner": "user","Title": "Fix Function Foo" }');

https://dev.mysql.com/doc/refman/5.7/en/json-search-functions.html

© www.soinside.com 2019 - 2024. All rights reserved.