web-dev-qa-db-fra.com

comment appeler une procédure stockée MySQL au démarrage de printemps en utilisant hibernate?

J'ai écrit un peu de logique dans procédure stockée dans MySQL e.J'utilise Spring Boot avec Hibernate. J'ai une procédure de connexion avec les paramètres IN OUT. À partir de ma procédure de connexion, je souhaite transmettre un message à l'utilisateur. Mais je ne sais pas comment appeler une procédure stockée au démarrage du printemps. Mon code est ci-dessous ..

  1. Ma procédure de connexion est

    CREATE PROCEDURE login(IN  in_user_id    varchar(100),
                               IN  in_password   varchar(100),
                               OUT out_code      INT,
                               OUT out_message   varchar(100))
     BEGIN
        IF in_user_id IS NULL OR in_user_id = ''
         THEN
         SET out_code = 1;
         SET out_message = 'Please Enter Your First Name.';
       END IF;
     /*Logi Here*/
    
     END;
    
  2. J'ai utilisé la classe d'entité comme 

    @Entity
    @Table(name = "user")
     @NamedStoredProcedureQueries({
       @NamedStoredProcedureQuery(
       name = "do_login", 
       procedureName = "login", 
       resultClasses = { LoginModel.class },    
       parameters = { 
          @StoredProcedureParameter( name = " in_user_id",  type = String.class,  mode = ParameterMode.IN),
          @StoredProcedureParameter( name = "in_password",  type = String.class,  mode = ParameterMode.IN),
          @StoredProcedureParameter( name = "out_code",  type = Integer.class,  mode = ParameterMode.OUT), 
          @StoredProcedureParameter( name = "out_message",  type = String.class,  mode = ParameterMode.OUT)
    
         }),
    
     })
    
     public class LoginModel implements Serializable {
    
       @NotEmpty
       private String userid;
    
       @NotEmpty
       private String password;
    
      //Here is getter setter
      }
    
  3. Dans Mon contrôleur de connexion, je souhaite appeler ma procédure pour pouvoir transférer mon utilisateur au tableau de bord.Si l'utilisateur entre un mauvais identifiant ou mot de passe, je souhaite afficher le message de la procédure. J'ai utilisé le code ci-dessous dans mon contrôleur de connexion

    @RequestMapping(value = "/login", method = RequestMethod.POST)
     public String doLogin(@ModelAttribute("webLoginForm") @Valid LoginModel registrationModel,
        BindingResult bindingResult, Model model, Errors error) {
         if(error.hasErrors()) {
             return "login";
         }
    
       // Here I want to check My Procedure result & redirect to welcome page
       //return "redirect:/welcome";
    
      return "login";
    }
    
  4. J'ai utilisé le référentiel mais il n'a rien écrit ici. J'ai utilisé le dépôt ci-dessous comme ..

       public interface LoginRepository  extends CrudRepository<LoginModel, Integer>{
    
    
     }
    
3
Enamul Haque

Vous pouvez appeler une procédure stockée à l'aide de javax.persistence.StoredProcedureQuery. Vous n'avez même pas besoin de déclarer quoi que ce soit sur votre entité.
Je suggèrerais de déplacer la logique d’appel de procédure vers un service, puis d’appeler la méthode de service depuis votre contrôleur.

Par exemple:

@Service
public class LoginServiceImpl implements LoginService {

    @PersistenceContext
    private EntityManager entityManager;

    public Boolean checkUsernameAndPassword(String username, String password) {

        //"login" this is the name of your procedure
        StoredProcedureQuery query = entityManager.createStoredProcedureQuery("login"); 

        //Declare the parameters in the same order
        query.registerStoredProcedureParameter(1, String.class, ParameterMode.IN);
        query.registerStoredProcedureParameter(2, String.class, ParameterMode.IN);
        query.registerStoredProcedureParameter(3, Integer.class, ParameterMode.OUT);
        query.registerStoredProcedureParameter(4, String.class, ParameterMode.OUT);

        //Pass the parameter values
        query.setParameter(1, username);
        query.setParameter(2, password);

        //Execute query
        query.execute();

        //Get output parameters
        Integer outCode = (Integer) query.getOutputParameterValue(3);
        String outMessage = (String) query.getOutputParameterValue(4);

        return true; //enter your condition
    }
}

Et ensuite, vous pouvez appeler cette méthode depuis votre contrôleur, après avoir injecté votre LoginService.

7
lzagkaretos

Vous pouvez essayer cette méthode pour appeler une procédure à partir de Spring

import Java.util.HashMap;
import Java.util.Map;
import Oracle.jdbc.driver.OracleTypes;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.SqlOutParameter;
import org.springframework.jdbc.core.SqlParameter;
import org.springframework.jdbc.core.simple.SimpleJdbcCall;

public class MainApplicationMethod 

{

public static void main(String[] args) throws Exception {

    JdbcTemplate jdbcTemplate = new JdbcTemplate();

    SimpleJdbcCall jdbcCall = new SimpleJdbcCall(jdbcTemplate).withProcedureName("procedureName");
    jdbcCall.addDeclaredParameter(new SqlParameter("parameter1", OracleTypes.VARCHAR));
    jdbcCall.addDeclaredParameter(new SqlOutParameter("outParam1",OracleTypes.VARCHAR));
    String value=null;
    Map<String, String> callParams = new HashMap<String, String>();
    callParams.put("parameter1", value);

    Map<String, Object> outputMap = jdbcCall.execute(callParams);
}

}

0
ashish singla