내 프로젝트에는 JPA 계층 Location -> Site
이 있습니다.계층 구조에서 검색된 엔티티 클래스
@Entity
@Table(name = "LOCATION")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="LOC_TYPE",discriminatorType=DiscriminatorType.STRING)
public class Location {
...
}
@Entity
@DiscriminatorValue("SI")
public class Site extends Location {
...
}
이제 모든 Employee
는 (지금까지 내가 말할 수있는, 그러한 모든 위치가 실제로 Site
경우에도) 할당 Location
의 목록이 있습니다. 어떤 부분에서는 Employee
에 할당 된 Site
의 목록이 필요합니다 (참고로, 내가 정의한 관계는 Location
입니다).
Hibernate 3.2에서 나는 Location
에 대한 쿼리를 작성하고 discriminant에 의해 필터링 할 수 있습니다. 반환 된 클래스는
Query query = em.createQuery("SELECT loc FROM Location loc WHERE loc.type=\"SI\"");
List<Location> locations = (List<Location>) query.getResultList();
for (Location location : locations) {
Site mySite = (Site) location;
...
}
는 그러나, 나는이 문제가 JPA 스펙에 의해 보장되는 경우 알려줍니다 또는 최대 절전 모드에서 바로 구현 결정에 어떤 문서를 찾을 실패 v.g : 더 구체적인 서브 클래스의 인스턴스입니다. 마지막으로 공급자를 전환하면 변경 될 수 있으므로이 방법을 사용하면 안됩니다.
내 접근 방식이 표준에 의해 지원되는지 알려 줄 수 있습니까?
BTW, 내가
UPDATE 최대 절전 모드 3.2 JPA 1을 사용하고 있습니다 : 오든에서
내가 원하는 것을 명확히하기 위해, 이것은 내가 구현 한 "안전 경보"입니다. disc
속성은 discriminator 열이므로 개체가 Site
인스턴스로 유지 된 위치에서 반환 된 것입니다.
Query query = em.createQuery("SELECT lo FROM Employee em JOIN em.location lo WHERE lo.disc = 'SI'");
List<Location> locations = (List<Location>) query.getResultList();
List<Site> site = new ArrayList<Site>();
for (Location location : locations) {
if (location instanceof Site) {
sites.add((Site) location);
} else {
log.warn("Found a Location that is not instance of Site");
}
}
는 JPA 스펙은 내
log.warn
문이 호출되지 않을 것이라는 점을 지정할 수 있습니까? AFAIK,
Site
인스턴스가 아닌
Location
을 반환 할 수 있습니다. 물론이 경우
Location
속성 만 사용할 수 있습니다. 이 동작은 C++에서 슬라이싱과 다소 비슷합니다.
아직 문제를 설명하지 않았다고 생각합니다. 'LOC_TYPE' DB 열에 매핑되는 Java 필드'disc'가 있습니까? 그렇지 않다면, 당신은 단순히 그것을 시도 할 수 있습니다. 또한 예제에서 : 단순히 사이트 엔티티를 직접 확인하지 않아도됩니다. 'SELECT s FROM Site s WHERE ...'? –
내 JPQL은 약간의 단순화 였지만 이제는 더 대표적인 것입니다. 'Site' 엔티티는 'Location' 수퍼 클래스 탐색을 통해 얻을 수 있기 때문에 선택할 수 없습니다. 마지막 해결책으로'Location'의 ID를'Site's의 선택으로 되돌려주는 subselect로 해결할 수있었습니다. 그러나이 문제는 나에게 궁금증을 남겼습니다. (또한 나는' IN'는 성능 문제에 대해 하위 선택). – SJuan76
1. Subselect는'IN'보다 나쁩니다. 2. 당신이 1000 개의 값을 가지고 있지 않는 한,'IN'은 결코 문제가되지 않습니다. 3. 당신은 나의 첫 번째 아이디어에 대해 아무 말도하지 않았다. (아마도 이미 그것을 사용했을 것이다.) 당신의'LOC_TYPE' DB 판별 자 칼럼에 매핑되는 자바 필드 eType을 추가하고 당신의 쿼리에 그것을 사용하기 만하면된다. –