私はJPASPRING DATA JPAにストアドプロシージャMySQLを呼び出す方法を
に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がある:という名前の無効なミックスと 位置パラメータ