2017-04-26 14 views
1

JPA 2.1 프로젝트가 있으며 데이터베이스에는 2 개의 테이블이 있습니다. 나는 인터페이스 "UsedClasses.java"를 만들어 두 엔티티는 인터페이스를 구현해야했다. 즉,JPA 엔티티의 인터페이스에서 @NamedQuery 가져 오기

@Entity 
@Table(name = "runRanges") 
@NamedQuery(name = "RunRange.findAll", query = "SELECT r FROM RunRange r") 
public class RunRange extends AbstractTimestampEntity implements UsedClasses, Serializable .... 

@Entity 
@Table(name = "users") 
@NamedQuery(name = "User.findAll", query = "SELECT u FROM User u") 
public class User extends AbstractTimestampEntity implements UsedClasses, Serializable ... 

나는 내가 NamedQuery을 잡아 인터페이스를 사용할 수 있는지 알고 궁금 어느 쪽의 실체에 대해서도. 클래스에 따라 결과 목록을 가져 오는 경우 달성하려는 작업.

public List<UsedClasses> getAllItems() { 
    open(); 
    Query query = EntityManagerHandler.INSTANCE.getEntityManager().createQuery(UsedClasses.class.getResource(NamedQueries)); 

    List<UsedClasses> aList = query.getResultList(); 
    return aList; 
} 
당신은 그것을 할 수 있지만 NamedQuery 주석을 검색하기 위해 반사를 사용해야하고 당신이 당신의 예에서와 같이 UsedClasses 인스턴스가 아닌 인터페이스를 가질 필요가

답변

1

다음과 같은 경우에, 게다가

Query query = EntityManagerHandler.INSTANCE.getEntityManager().createQuery(UsedClasses.class.getResource(NamedQueries)); 

을 여러 주석을 추가하면 더 이상 작동하지 않습니다.

더 간단하고 깨끗한 솔루션은 인터페이스에 메서드를 추가하여 namedQuery String 이름을 얻는 것이라고 생각합니다. 예를

public interface UsedClasses(){ 
    String getNamedQueryForGetAll();  
} 

를 들어
그리고이 방법으로 그것을 구현할 수 :

@Entity 
@Table(name = "users") 
@NamedQuery(name = "User.findAll", query = "SELECT u FROM User u") 
public class User implements UsedClasses(){ 
    public String getNamedQueryForGetAll(){    
     return "User.findAll"; 
    } 
} 

그런 다음이 방법을 사용할 수 있습니다 : 이제

Query query = EntityManagerHandler.INSTANCE.getEntityManager().createQuery(usedClassInstance.getNamedQueryForGetAll()); 

, 나는 것을 발견 약간의 복제본을 생성하고 곧바로 읽을 수있는 것은 아닙니다.
NamedQuery은 극히 작은 성능 향상을 가져옵니다.
코드에 도입 된 복잡성/간접적 인 수준으로 인해 실행 시간 측면에서 극히 소수를 얻을 수 있다는 확신을 얻지 못했습니다.

+0

첫 제안 사항 : 쿼리 쿼리 = EntityManagerHandler.INSTANCE.getEntityManager(). createQuery (UsedClasses.class.getResource (NamedQueries)); 이것은 작동하지 않습니다. 오류 메시지는 NamedQueries를 변수로 해석 할 수 없음을 나타냅니다. 두 번째 제안 : 쿼리를 생성하는 클래스에서 UsedClasses를 인스턴스화하지 않기 때문에이 메서드를 사용하는 방법을 이해할 수 없습니다. getNamedQueryForGetAll() 메소드를 호출하려면 어떻게해야합니까? – mkunkel

+0

좋아, 내가 편집 할 때 질문에 대답했다. 죄송합니다. 하지만 이제 인스턴스에서 인터페이스가 어떤 클래스인지를 알 수 없습니다. – mkunkel