JPQL-запрос SELECT необязательно + общий выбор DAO

StackOverflow https://stackoverflow.com/questions/2272055

  •  20-09-2019
  •  | 
  •  

Вопрос

Я следовал рабочему примеру JPA для получения объектов категории как таковых:

return (ArrayList<Category>) getEntityManager().createQuery("from Category").getResultList();

Запрос очень сокращен, и я не могу найти правила того, что является необязательным, а чего нет ни в одном из руководств.Приемлема ли такая краткость?

Во-вторых, теперь я хочу реализовать это в общем DAO, например:

public interface DAO<E, K>
{
    List<E> getAll();
}

Как я могу переписать первый запрос, чтобы он работал для всех типов, поскольку я не могу жестко запрограммировать «из категории»..?

Это было полезно?

Решение

  1. Да, краткость приемлема.Хотя я предпочитаю полный синтаксис, потому что он более «привлекательный» для тех, у кого больше опыта работы с SQL.

  2. Вам необходимо добавить 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];
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top