SELECT문에 "this"를 사용하여 메모리의 Java 콜렉션에 있는 오브젝트 참조

메모리의 콜렉션에 대한 쿼리의 SELECT문에 "this"를 사용하여 콜렉션의 오브젝트를 참조할 수 있습니다.
"this"를 사용하여 콜렉션의 오브젝트를 참조할 수 있으면 두 가지 이유로 유용합니다.

"this"의 작동 방식

각 콜렉션의 경우, 콜렉션에 의해 포함된 오브젝트는 콜렉션의 컨텐츠를 표시하는 SQL 테이블에서 'this'로 이름 지정된 컬럼의 컨텐츠가 되기 쉽습니다.

pureQuery는 콜렉션의 포함된 오브젝트 클래스를 검사하여 해당 오브젝트에 있는 특성의 이름을 판별합니다. 특성 이름은 SQL 테이블의 컬럼 이름이 되고 특성 값은 SQL 테이블의 해당 행의 값이 됩니다.

예를 들어, Customer라는 List<Customer> 콜렉션과 Customer Bean의 정의를 고려하십시오.

public Customer {
    public Integer custId;
    public String name;
    public String addressl1;
    public String city;
    public Integer storeRegion;
 }

pureQuery는 다음과 같은 가상 SQL 테이블에 콜렉션의 컨텐츠를 표시할 수 있습니다.

표 1. List<Customer> 고객에 대한 가상 SQL 테이블
THIS CUSTID NAME ADDRESSL1 CITY REGION
Customer object 0 001 중요 고객 1234 Market Street San Francisco 900
Customer object 1 002 다른 중요 고객 5678 California Street San Francisco 900
Customer object 2 003 또 다른 중요 고객 90 North First Street San Jose 900

예제

Customer 오브젝트의 목록을 쿼리하고 영업 지역에서 다섯 개의 가장 큰 도시에 있는 Customer를 표시하는 해당 오브젝트를 리턴하기 위해 어노테이션이 있는 메소드가 필요하다고 가정하십시오.

다음과 같이 메소드를 작성할 수 있습니다.

@Select(sql="SELECT cr.custId, cr.name, cr.addressl1, " + 
         " cr.city, cr.storeRegion " +
         " FROM ?1 AS cr, ?2 AS t5 WHERE cr.city = t5.city ")  
  List<Customer> getMailingList(List<Customer> curRegion,
                       CitySize[] topFive);
CitySize 클래스는 다음과 같은 정의를 가질 수 있습니다.
public class CitySize {
  public String city;
  public Integer size;
}

Customer 오브젝트는 curRegion 목록에서 읽어오므로 CitySize 배열에 표시된 도시와 동일한 도시가 있는 오브젝트에 대해 선택된 컬럼 값은 Customer 오브젝트의 새 인스턴스를 채우는 데 사용되고 해당하는 새 오브젝트는 getMailingList() 메소드가 리턴하는 목록에 추가됩니다.

또한 다음과 같이 Customer 오브젝트의 모든 컬럼을 선택할 수 있습니다.

@Select(sql="SELECT cr.* " +
         " FROM ?1 AS cr, ?2 AS t5 WHERE cr.city = t5.city ")  
  List<Customer> getMailingList(List<Customer> curRegion,
                       CitySize[] topFive);

Customer 오브젝트의 인스턴스는 curRegion 목록에서 읽어오므로 CitySize 배열에 표시된 도시와 동일한 도시가 있는 오브젝트에 대해 선택된 모든 컬럼 값("this" 컬럼 포함)은 Customer 오브젝트의 새 인스턴스를 채우는 데 사용되고 해당하는 새 오브젝트는 getMailingList() 메소드가 리턴하는 목록에 추가됩니다.

두 메소드 모두 쿼리와 일치하는 Customer 오브젝트의 새 인스턴스를 작성합니다. SELECT문의 목록에 "this"를 사용하고 쿼리와 일치하는 오브젝트의 유형이 다음 유형에 속하는 경우, 사용자 메소드도 쿼리와 일치하는 오브젝트의 새 인스턴스를 작성합니다.
  • 기본 유형 또는 기본 유형의 랩퍼
  • byte[]
  • java.sql.Date
  • java.sql.Time
  • java.sql.Timestamp

이 예제에서 Customer 오브젝트는 curRegion 목록에서 읽어오므로 CitySize 배열에 표시된 도시와 동일한 도시가 있는 오브젝트는 getMailingList() 메소드가 리턴하는 목록에 추가됩니다.

@Select(sql="SELECT cr.this FROM ?1 AS cr, ?2 AS t5 " +
            " WHERE cr.city = t5.city ")  
  List<Customer> getMailingList(List<Customer> curRegion,
                       CitySize[] topFive);

getMailingList() 메소드의 서로 다른 버전 간의 차이는 이 메소드가 List<Map<String,Object>> 오브젝트를 리턴하도록 정의된 경우 더 명확하게 표시될 수 있습니다.

첫 번째 버전에서는 결과적으로 각 Map 오브젝트가 값이 custid, name, addressl1, citystoreregion인 문자열 키를 포함하게 됩니다.

두 번째 버전에서는 결과적으로 각 Map 오브젝트가 값이 this, custid, name, addressl1, citystoreregion인 문자열 키를 포함하게 됩니다.

세 번째 버전에서는 결과적으로 각 Map 오브젝트가 값이 this인 문자열 키를 포함하게 됩니다.


피드백