Domanda

Ho seguito un JPA esempio di lavoro per recuperare oggetti Categoria in quanto tale:

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

La query è molto stenografia - e non riesco a trovare le regole per ciò che è opzionale e ciò che non è in nessuna delle guide. È questo brevità accettabile?

In secondo luogo, voglio attuare ora questo in un DAO generica, qualcosa come:

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

Come posso riscrivere la prima query di lavorare per tutti i tipi come non posso hardcode il "dalla categoria" ..?

È stato utile?

Soluzione

  1. Sì, la brevità è accettabile. Anche se io preferisco la sintassi completa, perché è più "attraente" per altri che hanno più esperienza di SQL.

  2. È necessario aggiungere un parametro Class<E> al tuo DAO:

    public List<E> getAll(Class<E> entityClass) {
         Query query = enittyManager.createQuery("from " + entityClass.getName());
         query.getResultList();
    }
    

Altri suggerimenti

In realtà non c'è bisogno di utilizzare un parametro di metodo, ma è possibile utilizzare la riflessione.

Esempio di codice utilizzando la riflessione

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];
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top