2017-03-22 43 views
1

私はJPASPRING DATA JPAにストアドプロシージャMySQLを呼び出す方法を

call-stored-procedures-jpa

にmysqlのストアドプロシージャを呼び出すが、私の手順APIが全く出paramentを入れないようにどのように読んでください!

それを呼び出すと、春に結果を返すためにどのようにデータ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 p6spy callはokです!しかし、ログ内

16時26分30秒[INFO] [メイン] [] [] LocalContainerEntityManagerFactoryBean:永続ユニットに対して初期化JPA のEntityManagerFactory 'PersistanceUnitTest' 16時26分31秒[INFO] [メイン] [ ] [] p6spy:1490189191865 | connectionId 2 | 118経過|カテゴリ文 {(1)GET_TERMINAL_TRANSACTION_KEYを呼び出す}テストを実行します。1、失敗:0、エラー:1、スキップ:0、時間経過:5.18秒< < < FAILUREを! - ru.service.TerminalTransactionKeyServiceImplTest testNextId(ru.service.TerminalTransactionKeyServiceImplTest)に 時間経過:0.47秒< < < ERROR! o rg.springframework.dao.InvalidDataAccessApiUsageException:無効 名前付きパラメーターと定位置パラメーターの組み合わせ。ネストされた例外は java.lang.IllegalArgumentExceptionがある:という名前の無効なミックスと 位置パラメータ

答えて

0

最善の解決策

@Override 
public Long nextIdByTerminalId(Long terminalId) { 
    return jdbcTemplate.queryForObject("CALL GET_TERMINAL_TRANSACTION_KEY(?)", new Object[]{terminalId}, Long.class); 
} 
関連する問題