리턴하려는 데이터의 계층 데이터 구조를 정의하는 중첩된 Bean 세트를 작성합니다. @JoinPoint 어노테이션을 ResultSet 오브젝트의 열과 일치하는 Bean 특성에 지정하는 경우 pureQuery Runtime이 적절한 구현을 생성합니다. pureQuery Runtime은 ResultSet 오브젝트 및 중첩된 Bean 처리 후에 리턴되는 Bean인 최상위 레벨 Bean의 계층 구조를 분석합니다. ResultSet 오브젝트 열에 의해 업데이트되고 @JoinPoint 어노테이션이 있는 Bean 또는 Bean 목록만 생성되고 채워집니다. ResultSet 오브젝트 열에 의해 채워지지 않고 @JoinPoint 어노테이션이 없는 Bean 또는 Bean 목록은 널(NULL) 또는 Bean 생성자 초기화 값입니다.
다음은 두 Bean을 표시하는 예입니다. 최상위 레벨 Bean은 부서 bean이며 하위 bean은 직원 bean의 목록입니다.
Select D.DEPTNO, D.DEPTNAME, D.MGRNO, D.ADMRDEPT, E.EMPNO, E.FIRSTNME, E.MIDINIT, E.LASTNAME, E.JOB, E.SEX, E.BIRTHDATE, E.SALARY from (DEPARTMENT AS D LEFT JOIN EMPLOYEE AS E ON D.DEPTNO=E.WORKDEPT) WHERE D.DEPTNO=? ORDER BY D.DEPTNO, E.LASTNAME
@Select(sql = "Select D.DEPTNO, D.DEPTNAME, D.MGRNO, D.ADMRDEPT, E.EMPNO, E.FIRSTNME, E.MIDINIT, E.LASTNAME, E.JOB, E.SEX, E.BIRTHDATE, E.SALARY from (DEPARTMENT AS D LEFT JOIN EMPLOYEE AS E ON D.DEPTNO=E.WORKDEPT) WHERE D.DEPTNO=? ORDER BY D.DEPTNO, E.LASTNAME") public Department joinTest (String deptNo);
@Table(name = "DEPARTMENT") public class Department { @Id @GeneratedKey public String deptNo; // this is the ID of the bean and its value is generated by the database public String deptName; public String mgrNo; public String admrDept; @JoinPoint(@JoinColumn(name = "EMPNO", table = "EMPLOYEE", propertyName = "empNo")) public List<Employee> deptEmployees; }
@Table(name = "EMPLOYEE") public class Employee { @Id @GeneratedKey public String empNo; // this is the ID of the bean and its value is generated by the database public String firstNme; public String midInit; public String lastName; public String workDept; public String job; public String sex; public java.sql.Date birthdate; public String salary; }
SQL 쿼리 및 Bean을 기반으로 pureQuery Runtime이 Bean의 구현 코드를 생성합니다.
리턴된 Java 오브젝트는 11개의 deptEmployees Bean의 java.util.list를 포함하는 하나의 부서 Bean입니다.
dept admr mid No deptName mgrNo Dept empNo firstNme Init lastName job sex birthdate salary D11 MANUFACTURING SYSTEMS 000060 D01 000150 BRUCE ADAMSON DESIGNER M 1977-05-17 55280.00 000200 DAVID BROWN DESIGNER M 1971-05-29 57740.00 200220 REBA K JOHN DESIGNER F 1978-03-19 69840.00 000210 WILLIAM T JONES DESIGNER M 2003-02-23 68270.00 000220 JENNIFER K LUTZ DESIGNER F 1978-03-19 49840.00 000160 ELIZABETH R PIANKA DESIGNER F 1980-04-12 62250.00 000180 MARILYN S SCOUTTEN DESIGNER F 1979-02-21 51340.00 000060 IRVING F STERN MANAGER M 1975-07-07 72250.00 000190 JAMES H WALKER DESIGNER M 1982-06-25 50450.00 200170 KIYOSHI YAMAMOTO DESIGNER M 1981-01-05 64680.00 000170 MASATOSHI J YOSHIMURA DESIGNER M 1981-01-05 44680.00
중첩된 Bean 세트를 생성하고 채울 때 pureQuery Runtime은 Bean 상위에 있는 Bean에 대한 참조의 @JoinPoint 어노테이션 또는 Bean 자체의 @Id 어노테이션을 사용합니다. 어노테이션은 상위 Bean에 하위 Bean을 링크하는 ID 컬럼을 정의합니다. 예를 들어, pureQuery Runtime은 ID 컬럼을 사용하여 상위 Bean의 Bean 목록을 생성할 시기를 판별합니다.
예를 들어, EMPLOYEE 테이블은 열을 식별할 수 있는 복수 컬럼을 포함할 수 있습니다. ID 컬럼으로 정의될 수 있는 열은 직원 번호 또는 직원 주민등록번호입니다. ID 컬럼은 테이블의 기본 키일 수 있지만 테이블 키일 필요는 없습니다. 복합 키가 데이터베이스 테이블에서 작성될 수 있는 것처럼 복수 컬럼은 복합 키로 결합될 수 있습니다. 동일한 이름을 가진 직원이 있을 수 있으므로 EMPLOYEE 테이블 ID 컬럼에 이름을 선택하는 것은 좋지 않습니다.
pureQuery Runtime은 Bean이 올바른 순서의 올바른 데이터 세트로 채워지는지 확인합니다. 예를 들어, ResultSet 데이터는 중첩된 Bean 구조로 정확히 맵핑되도록 정렬되지 않을 수 있습니다. pureQuery Runtime은 ResultSet의 처리 이전에 작성된 Bean에 속하는 ResultSet 데이터를 프로세스할 수 있으며 올바른 순서의 적절한 데이터로 Bean을 채울 수 있습니다.
적절한 어노테이션과 함께 더 복잡한 중첩 구조를 작성하여 복합 Join 술어가 있는 SQL문에서 결과를 리턴하는 중첩된 Bean 세트를 작성할 수 있습니다. 올바른 결과를 리턴하는 중첩된 Bean 세트를 작성하려면 다음 규칙을 따라야 합니다. SQL 쿼리 또는 Bean에 대한 변경사항은 유용한 Bean 세트를 생성하는 데 필요할 수 있습니다.
이 문제점은 SQL 쿼리에서 별명을 지정하여 해결할 수 있습니다. @Column, @Table 또는 @JoinColumn 어노테이션은 둘 이상의 열이 있는 Bean의 특성의 테이블 이름과 함께 지정될 수도 있습니다.
기본 특성 이름은 ResultSet 오브젝트에 대한 해당 맵핑을 수정하는 기존 어노테이션이 없는 Bean 특성의 이름입니다. 필드의 경우 기본 특성 이름은 Java 변수 이름입니다. 가져오기, 세트 또는 is 메소드의 경우 이는 get, set 또는 is 접두부가 없고 첫 번째 문자가 소문자인 메소드 이름입니다. 다음 예에서 ResultSet 열 레이블 WORKDEPT는 대소문자를 구분하지 않습니다.
@Column (name = "WORKDEPT") public String getWorkDepartment ();
@JoinColumn 어노테이션은 Bean 또는 Bean 목록의 @JoinPoint 어노테이션 내에 지정할 수 있습니다. 그런 경우 지정된 name 및 table 요소는 지정되는 연관된 @Column 어노테이션을 포함하여, 하위 Bean @Id 어노테이션에서 정의되는 열 레이블 및 선택적 테이블 이름을 겹쳐씁니다.
하위 Bean은 @Id 어노테이션을 가질 수 있습니다. 이 경우 @JoinColumn 어노테이션 필수 요소 name은 하위 Bean의 기본 특성 이름과 일치해야 합니다. 이름이 일치하지 않는 경우 선택적 요소 propertyName은 하위 Bean에 있는 일치하는 기본 특성의 이름과 함께 지정되어야 합니다.
@JoinPoint(@JoinColumn(name = "EMPNO", table = "EMPLOYEE", propertyName = "empNo")) public List<Employee> deptEmployees;
@JoinPoint(@JoinColumn(name = "EMPNUM", table = "EMPLOYEE", propertyName = "empNo")) public List<Employee> deptEmployees;
@JoinPoint(@JoinColumn(name = "WORKDEPT", table = "EMPLOYEE", propertyName = "workDept")) public List<Employee> deptEmployees;
하위 Bean은 단일 Bean이거나 Bean의 목록이어야 하며 하위 Bean에는 @JoinPoint 어노테이션이 있어야 합니다. 하위 Bean 또는 Bean 목록을 정의하는 상위 Bean 특성에 @JoinPoint 어노테이션이 있어야 합니다.
이 맵핑의 예는 기본 키인 열 DEPTNO가 있는 DEPARTMENT 테이블 및 열 DEPTNO가 있는 PROJECT 테이블입니다. PROJECT 테이블 DEPTNO 열은 DEPARTMENT 테이블의 외부 키입니다. ResultSet 오브젝트의 열 및 특성 간의 기본 일치는 열 레이블입니다. 이 예에서 DEPARTMENT 및 PROJECT 테이블의 결합으로 열 레이블이 DEPTNO인 두 열이 생길 수 있습니다. 상위 및 하위 Bean 구조에 다른 정보가 있는 열이 필요한 경우 Bean에 어노테이션을 추가할 수 있습니다. 어노테이션은 테이블 이름을 사용하여 열을 고유하게 만들 수 있습니다. 또한 고유한 열 레이블을 작성하기 위해 별명을 추가하여 SQL문을 수정할 수도 있습니다. 그러나 이는 다중 열에 동일한 데이터가 포함될 때 하나의 열만 리턴하는 결합에 대한 SQL 조회에서 공통적입니다. 이 경우 이는 다중 특성을 업데이트하기 위한 하나의 열에만 유효합니다.
인라인 메소드 스타일을 사용하면 동일한 ResultSet 열에 의해 업데이트될 다중 특성의 경고가 표시됩니다. 경고가 있고 추적 레벨이 java.util.logging.Level.WARNING 또는 자세히로 설정되는 경우 pureQuery Runtime 로그 파일에 경고가 로그인됩니다.
원래 상위 Bean의 모든 하위 Bean은 하위 Bean이 있는지 여부를 판별하도록 하위 Bean이 프로세스되기 전에 프로세스됩니다.
pureQuery Runtime은 하위 Bean 클래스가 처음으로 프로세스되는지 여부 또는 Bean에 반복적 참조가 있는지 여부를 판별할 수 있습니다. 중첩된 Bean 구조를 구문 분석하는 pureQuery Runtime에서 이미 구문 분석된 Bean을 발견하는 경우 해당 하위 Bean의 구문 분석이 중지됩니다.
Bean에 대한 반복적 참조도 pureQuery runtime이 하위 Bean의 특성을 채우는 방법에 영향을 미칩니다. Bean의 첫 번째 인스턴스만 채워집니다. 참조에 정의된 다른 columnPrefix 요소가 있는 @JoinColumn 어노테이션이 있지 않는 한 해당 참조에 대한 이후 참조가 무시됩니다. 단일 Bean 내의 특성 처리 순서가 비결정적이므로 하위 Bean이 프로세스되는 순서도 비결정적입니다. 그러나 하위 Bean은 중첩 레벨 순서로 프로세스됩니다. 예를 들어, 상위 Bean에서 직접 중첩되는 Bean은 다음 중첩 레벨의 Bean 이전에 프로세스됩니다.
columnPrefix 요소에 대한 정보는 @JoinPoint 어노테이션 문서를 참조하십시오.