spring 데이터 jpa 호출 저장 프로세스

6660 단어
인터넷상의 이 방면의 예는 그리 많지 않으니, 연구를 해서 몇 가지 호출 방법을 열거하였다.
만약 우리가 mysql의 저장 프로세스를 가지고 있다면
CREATE DEFINER=`root`@`localhost` PROCEDURE `plus1inout`(IN ARG INT, OUT res INT)
BEGIN 
    SET res = ARG + 1;
END

int 인자를 입력해서 이 인자 +1을 되돌려줍니다.
만약 우리가 이 저장 프로세스를 호출하려고 한다면.이렇게 할 수 있어요.
 
치수 entity
package com.labofjet.entity;

import javax.persistence.Embedded;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.NamedStoredProcedureQueries;
import javax.persistence.NamedStoredProcedureQuery;
import javax.persistence.ParameterMode;
import javax.persistence.StoredProcedureParameter;

@Entity
@NamedStoredProcedureQueries({
        @NamedStoredProcedureQuery(name = "User.plus1", procedureName = "plus1inout", parameters = {
                @StoredProcedureParameter(mode = ParameterMode.IN, name = "arg", type = Integer.class),
                @StoredProcedureParameter(mode = ParameterMode.OUT, name = "res", type = Integer.class) }),
        @NamedStoredProcedureQuery(name = "User.mytest", procedureName = "mytest") })
public class A {
    @EmbeddedId
    APK id;

    String age;

    @Embedded
    AComponent acomponent;

    public AComponent getAcomponent() {
        return acomponent;
    }

    public void setAcomponent(AComponent acomponent) {
        this.acomponent = acomponent;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public APK getId() {
        return id;
    }

    public void setId(APK id) {
        this.id = id;
    }

    @Override
    public int hashCode() {
        // TODO Auto-generated method stub
        System.out.println("Ahash");
        return super.hashCode();
    }

    @Override
    public boolean equals(Object obj) {
        // TODO Auto-generated method stub
        System.out.println("Aequals");
        return super.equals(obj);
    }
}

아무거나entity를 찾으면 됩니다. 만약 여러 개의 저장 프로세스가 있다면 @NamedStoredProcedureQueries를 제 위와 같이 사용할 수 있습니다.만약 1개의 저장 프로세스만 있다면 @NamedStoredProcedureQuery로 @NamedStoredProcedureQueries를 대체할 수 있습니다.
@StoredProcedureParameter는 저장 프로세스를 표시하는 매개 변수입니다.별거 아니에요.다만 name과 데이터베이스에 있는 매개 변수의 이름이 같음을 주의해야 합니다.
@NamedStoredProcedureQuery에 있는procedureName도 데이터베이스에 저장된 프로세스의 이름과 같습니다.한편name는 스스로 값을 얻을 수 있으며 데이터베이스와 관계가 없다
 
repository 마크업 방법
package com.labofjet.repository;

import java.util.List;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.query.Procedure;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import com.labofjet.entity.A;
import com.labofjet.entity.APK;

@Repository
public interface ARepository extends JpaRepository<A, APK>{
    
    @Procedure
    Integer plus1inout(Integer arg);
    
    @Procedure(name="plus1")
    Integer alias1(Integer arg);
    
    @Procedure(procedureName="plus1inout")
    Integer alias2(Integer arg);
    
    @Procedure(name="User.plus1")
    Integer alias3(@Param("arg")Integer argAlias);
    
    @Procedure
    Object[] mytest();
}

entity A에 대응하는 Repository에서 그 저장 프로세스를 찾을 수 있는 여러 가지 방법이 있습니다
    @Procedure
    Integer plus1inout(Integer arg);
    
    @Procedure(name="plus1") Integer alias1(Integer arg); @Procedure(procedureName="plus1inout") Integer alias2(Integer arg); @Procedure(name="User.plus1") Integer alias3(@Param("arg")Integer argAlias);


위의 네 가지 방법 중
Integer alias1(Integer arg);


이 방법은 안 돼, 다른 3가지 방법은 다 돼...사실 Alias1도 괜찮을 것 같은데...버그인지 아닌지...
    @Procedure
    Integer plus1inout(Integer arg);


위의 이 방법을 사용하면 방법명은 저장 프로세스 이름과 같아야 한다.
    @Procedure(name="plus1")
    Integer alias1(Integer arg);

Alias1이라는 방법으로 하면 틀릴 수 있어요.Alias3로 바꾸는 방법을 고려할 수 있어요.메서드의 매개 변수에 @Param 주석을 추가하면 오류가 발생하지 않습니다.(난 이게 버그라고 생각해)
    @Procedure(procedureName="plus1inout")
    Integer alias2(Integer arg);

상기에서 이런 방법은procedure를 데이터베이스에 저장하는 과정의 이름으로 설정해야 한다. 장점은alias3과 마찬가지로 방법명을 마음대로 짓는 것이다. 이것은plus1inout 방법명에 비해 고정만 할 수 있고 더욱 유연하다.
 
이 3가지 방법 중에 첫 번째가 제일 쉬울 것 같은데...어떤 주석의 속성도 쓰지 않아도 되는데..유일한 요구는 방법의 이름이 저장 프로세스의 이름과 같다는 것이다.
 
기타
스프링 데이터 jpa 호출 저장 프로세스가 비교적 간단한 것 같습니다.하지만 저장 프로세스가 결과 집합을 되돌려주면 잘 처리되지 않을 것 같은데..(많은 참고를 보았지만 뾰족한 해결책이 없다.. 후속으로 새로운 발견이 있으면 갱신한다)

좋은 웹페이지 즐겨찾기