当前位置: 首页 > 知识库问答 >
问题:

如何使用Hibernate在Spring Boot中调用MySQL存储过程?

吕高昂
2023-03-14
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;
@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
  }
@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";
}
   public interface LoginRepository  extends CrudRepository<LoginModel, Integer>{


 }

共有1个答案

梁宪
2023-03-14

您可以使用javax.persistence.StoredProceduRequery调用存储过程。您甚至不需要在实体上声明任何东西。
我建议将过程调用逻辑移动到服务,然后从控制器调用服务方法。

例如:

@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
    }
}

然后,在注入LoginService之后,可以从控制器调用此方法。

 类似资料:
  • 下面是我的Oracle存储过程, 我得到以下异常:hibernate:{CALL REPORT_HIBERNATE(?)}org.hibernate.exception.GenericJDBcException:无法执行查询...并且由:java.sql.sqlException:无效的列索引引起 Plz让我知道在Spring中我将如何使用Hibernate注释调用这个存储过程??

  • 问题内容: 昨晚我刚刚开始学习hibernate,它相当有趣。我在使用hibernate将存储过程作为sql查询调用时遇到麻烦。我已附上来源和错误,请帮助我。谢谢 :) 这是Java文件::: 错误是::: 问题答案: 我基本上不使用hibernate的getNamedQuery重新设计输入,但是java.sql类可以正常工作!

  • 我有一个在包中定义的存储过程。该过程接受两个参数,一个是游标: 我是这样调用这个过程的: 它将返回以下错误: 你好,阿尼尔班。

  • 问题内容: 我在任何地方都找不到此答案,但是可以从MySQL中的另一个存储过程调用存储过程吗?我想找回标识值,并在父存储过程中使用它。我们不能再使用FUNCTIONS! 问题答案: 参数应该可以帮助您将值返回给调用过程。基于此,解决方案必须是这样的。

  • 问题内容: 我已经在 MySQL存储过程 e中编写了一些逻辑。我正在将 spring boot与hibernate一起使用 。我有一个使用 IN OUT 参数的登录过程。从我的登录过程中,我想将消息传递给用户。但是我不知道如何在Spring Boot中调用存储过程。我的代码在下面。 我的登录过程是 我用过像 在我的登录控制器中,我想调用我的过程,以便可以将我的用户转发到仪表板。如果用户输入了错误的

  • 我阅读了如何在JPA中调用mysql存储过程 调用存储过程jpa 但是我的程序api没有输出passe! 如何在spring数据jpa中调用它并返回结果 Java实体 我的回购 还有我的测试 out p6间谍通话没问题!但在日志中 16:26:30[INFO][main] [] [] LocalContainerEntityManagerFactoryBean:初始化的JPA EntityMana