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

如何在SPRING DATA JPA中调用存储过程Mysql

公羊雅达
2023-03-14

我阅读了如何在JPA中调用mysql存储过程

调用存储过程jpa

但是我的程序api没有输出passe!

如何在spring数据jpa中调用它并返回结果

CREATE DEFINER=`tester`@`%` PROCEDURE `GET_TERMINAL_TRANSACTION_KEY` (in a_id_term integer unsigned)
BEGIN
declare v_trn_key bigint unsigned;
    set v_trn_key = null;
    start transaction;
    select seq from TERMINAL_TRANSACTION_KEY where id_term = a_id_term into v_trn_key for update;
    if v_trn_key is null then
        set v_trn_key = 1;
        insert into TERMINAL_TRANSACTION_KEY(id_term,seq) values(a_id_term,v_trn_key);
    else
        set v_trn_key = v_trn_key + 1;
        update TERMINAL_TRANSACTION_KEY set seq = v_trn_key where id_term = a_id_term;
    end if;
    commit;
    select v_trn_key;
END$$

Java实体

@Entity
@Table(name = "TERMINAL_TRANSACTION_KEY")
@XmlRootElement
@NamedStoredProcedureQueries({
   @NamedStoredProcedureQuery(name = "getNextTransactionKeyByTerminalId", 
                              procedureName = "GET_TERMINAL_TRANSACTION_KEY",
//                              resultClasses = {Object.class},
                              parameters = {
                                 @StoredProcedureParameter(mode = ParameterMode.IN, name = "a_id_term", type = Long.class)
                              })
})

public class TerminalTransactionKey implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "id")
    private Long id;
    @Basic(optional = false)
    @NotNull
    @Column(name = "id_term" ,unique=true, nullable=false)
    private int idTerm;
    @Column(name = "seq")
    private BigInteger seq;

    public TerminalTransactionKey() {
    }

    public TerminalTransactionKey(Long id) {
        this.id = id;
    }

我的回购

import org.springframework.data.jpa.repository.Query;
import org.springframework.data.jpa.repository.query.Procedure;
import org.springframework.data.repository.query.Param;



public interface TerminalTransactionKeyRepository extends  CrudRepository<TerminalTransactionKey, Long>{


    @Procedure(name = "getNextTransactionKeyByTerminalId")
    Long nextIdByTerminalId(@Param("a_id_term") Long terminalId);

    @Query("UPDATE TerminalTransactionKey SET seq=:nextExtTrnId WHERE idTerm=:terminalId")
    int updateSequence(@Param("nextExtTrnId")Long nextExtTrnId, @Param("terminalId") Long terminalId);

}

还有我的测试

@Test
public void testNextId() {
    log.info(repository.nextIdByTerminalId(1L));

}

out p6间谍通话没问题!但在日志中

16:26:30[INFO][main] [] [] LocalContainerEntityManagerFactoryBean:初始化的JPA EntityManagerFactory为持久性单元'PeressanceUnitTest'16:26:31[INFO][main] [] [] p6spy:1490189191865|ConnectionId 2|elapse 118|类别语句{调用GET_TERMINAL_TRANSACTION_KEY(1)}测试运行:1,失败:0,错误:1,跳过:0,时间过去:5.18秒

共有1个答案

戚承业
2023-03-14

最佳解决方案

@Override
public Long nextIdByTerminalId(Long terminalId) {
    return jdbcTemplate.queryForObject("CALL GET_TERMINAL_TRANSACTION_KEY(?)", new Object[]{terminalId}, Long.class);
}
 类似资料:
  • 问题内容: 我试图在postgres 9.3上使用sql调用函数内的函数。 这个问题与我的另一篇文章有关。 我写了下面的函数。到目前为止,我还没有合并任何类型的save-output(COPY)语句,因此我试图通过创建嵌套函数print-out函数来解决此问题。 以上功能有效。 尝试创建嵌套函数。 调用嵌套函数。 输出 上面给出了这个。但是,当在print_out()中将arg1,arg2替换为’

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

  • 问题内容: 我有一个存储过程,大约需要2-3分钟才能完成其执行。从ado.net我想使存储过程的执行在后台发生。一旦我向存储过程发出请求,我就必须返回到我的代码。谁可以帮我这个事 ? 问题答案: 您应该研究Threading。简而言之,您可以通过调用存储过程来创建线程。当您启动线程时,它将在beackground中运行。该线程可以具有在该线程完成时调用的回调函数。 BackgroundWorker

  • 问题内容: 我有一个需要很多参数的插入存储过程-其中2个是@ FirstName,@ LastName。我还有一个更新存储过程,该过程需要许多参数-其中2个是@ FirstName,@ LastName。 我想做的是,从插入SP内部完成之后,调用更新SP并将其发送给@ FirstName,@ LastName。 我不知道这样做的正确语法;我试过了: 但我认为这是错误的。 有人可以告诉我怎么写这个电

  • 问题内容: SQL Server2005支持CLR,所以这意味着我们可以在后端使用CLR,所以该怎么做。我在c#中有一些函数,它对日期时间变量进行了一些复杂的操作,现在我想在SP中使用这些函数。首先,可以这样做。 问题答案: 是的,可以在SQL Server 2005数据库中使用.NET。请注意,SQL Server 2005支持的.NET版本是2.0。 这是使用Visual Studio制作CL