JPQL-запрос SELECT необязательно + общий выбор DAO
Вопрос
Я следовал рабочему примеру JPA для получения объектов категории как таковых:
return (ArrayList<Category>) getEntityManager().createQuery("from Category").getResultList();
Запрос очень сокращен, и я не могу найти правила того, что является необязательным, а чего нет ни в одном из руководств.Приемлема ли такая краткость?
Во-вторых, теперь я хочу реализовать это в общем DAO, например:
public interface DAO<E, K>
{
List<E> getAll();
}
Как я могу переписать первый запрос, чтобы он работал для всех типов, поскольку я не могу жестко запрограммировать «из категории»..?
Решение
Да, краткость приемлема.Хотя я предпочитаю полный синтаксис, потому что он более «привлекательный» для тех, у кого больше опыта работы с SQL.
Вам необходимо добавить
Class<E>
параметр для вашего DAO:public List<E> getAll(Class<E> entityClass) { Query query = enittyManager.createQuery("from " + entityClass.getName()); query.getResultList(); }
Другие советы
На самом деле вам не обязательно использовать параметр метода, но вы можете использовать Reflection.
Пример кода с использованием отражения
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
public class<T> DAO {
protected Class<T> clazz;
public DAO()
{
Type genericSuperclass = getClass().getGenericSuperclass();
// Allow this class to be safely instantiated with or without a parameterized type
if (genericSuperclass instanceof ParameterizedType)
clazz = (Class<T>) ((ParameterizedType) genericSuperclass).getActualTypeArguments()[0];
}
}