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(); 
} 

Проблемы (кроме моего IDE бросающего прилегания, не зная, что делать с T) является то, что я не знаю, как взять эту строку и передать его на месте ContentType.class.

Что мне не хватает, что препятствует признанию Netbeans T?

Будет ли objectName работать так, как я передаю его в качестве второго параметра в createNamedQuery()?

ответ

4

Вам необходимо объявить свой метод как общий, добавив список параметров типа (<T> в этом случае) перед возвратом метода метода. Тогда просто передать в классе объект нужного типа в качестве параметра:

public <T> List<T> findAll(Class<T> clazz) { 
    return this.emf.createEntityManager().createNamedQuery(
      clazz.getSimpleName()+".findAll", clazz).getResultList(); 
} 
+0

Можете ли вы объяснить, почему мне нужно иметь 'общественный Список ' а не просто 'public List '? – Webnet

+1

Поскольку вам нужно указать, какой тип '', вы можете заставить T расширять другой класс следующим образом: ''. Объявив '', вы указываете, что он может быть любого типа, который расширяет объект (т. Е. Все типы) –

+0

Gotcha! Кроме того, 'contentDao.findAll (« Пользователь »)' или 'contentDao.findAll (new User())' похоже, не является тем, что ищет эта функция ... – Webnet

2

Что-то вроде этого следует сделать трюк:

public <T> List<T> findAll(Class<T> klass) { 
    return this.emf.createEntityManager().createNamedQuery(klass.getSimpleName()+".findAll", klass).getResultList(); 
} 
Смежные вопросы