spring 데이터 jpa 호출 저장 프로세스
만약 우리가 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 호출 저장 프로세스가 비교적 간단한 것 같습니다.하지만 저장 프로세스가 결과 집합을 되돌려주면 잘 처리되지 않을 것 같은데..(많은 참고를 보았지만 뾰족한 해결책이 없다.. 후속으로 새로운 발견이 있으면 갱신한다)
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.