2012-04-19 3 views
0

사실 ... 내가 몇 가지 기능을 가지고 일반적인

@Override 
public List<ContentType> findAllContentTypes() { 
    return this.emf.createEntityManager() 
        .createNamedQuery("ContentType.findAll", ContentType.class) 
        .getResultList(); 
} 

@Override 
public List<Status> findAllStatus() { 
    return this.emf.createEntityManager() 
        .createNamedQuery("Status.findAll", Status.class) 
        .getResultList(); 
} 

이러한 기능을 통합하는 방법은 여러 가지의 모든 종류를 얻을 이들의 약 12있다. 나는이 함수들을 가져 와서 이들 모두를 대체하는 하나의 일반적인 함수를 만들고 싶다.

내가 할 수있는 최선의 방법은 findAll("Language") 같은 것을하는 것입니다. 나는

public List<T> findAll(String objectName) { 
    return this.emf.createEntityManager() 
        .createNamedQuery(objectName+".findAll", objectName) 
        .getResultList(); 
} 

(T 수행 할 작업을 모르고있는 적합을 던지는 내 IDE가 아닌) 문제는 내가 그 문자열을 가지고 대신에 그것을 전달하는 방법을 잘 모르겠어요 것입니다 ... 일을 시작 ContentType.class.

Netbeans이 T을 인식하지 못하게하는 것은 무엇이 있습니까?

createNamedQuery()에 두 번째 매개 변수로 전달하는 방식은 objectName일까요?

답변

4

메서드 반환 형식 앞에 형식 매개 변수 목록 (이 경우 <T>)을 추가하여 메서드를 일반 형식으로 선언해야합니다. 그런 다음 매개 변수로 올바른 유형의 클래스 객체 전달 :

트릭해야이 같은
public <T> List<T> findAll(Class<T> clazz) { 
    return this.emf.createEntityManager().createNamedQuery(
      clazz.getSimpleName()+".findAll", clazz).getResultList(); 
} 
+0

당신이 설명 할 수를 '공개 목록 '뿐 아니라? – Webnet

+1

어떤 타입의 타입이 ''인지를 나타낼 필요가 있기 때문에 T가 다음과 같이 다른 klass를 확장하도록 할 수 있습니다 :''. ''을 선언함으로써 Object (즉, 모든 타입)를 확장하는 모든 유형이 될 수 있음을 나타냅니다. –

+0

Gotcha! 또한,'contentDao.findAll ("User")'또는'contentDao.findAll (new User())'는이 함수가 찾고있는 것 같지 않습니다 ... – Webnet

2

뭔가 : 나는`공공 목록 을`이해야하는 이유

public <T> List<T> findAll(Class<T> klass) { 
    return this.emf.createEntityManager().createNamedQuery(klass.getSimpleName()+".findAll", klass).getResultList(); 
} 
관련 문제