Frage

Ich habe eine funktionierende JPA Beispiel gefolgt Kategorie Objekte als solche zu erhalten:

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

Die Abfrage ist sehr Stenografie - und ich kann die Regeln für nicht finden, was optional ist und was in einem der Führer nicht. Ist dies der Kürze halber akzeptabel?

Zweitens, ich möchte dies in einem allgemeinen DAO jetzt implementieren, etwas wie:

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

Wie kann ich die erste Abfrage an der Arbeit für alle Arten umschreiben, da ich nicht hart codieren kann die „in der Kategorie“ ..?

War es hilfreich?

Lösung

  1. Ja, das ist die Kürze akzeptabel. Obwohl ich die vollständige Syntax bevorzugen, weil es mehr „attraktiv“ zu anderen ist, die mehr SQL-Erfahrung haben.

  2. Sie haben einen Class<E> Parameter auf Ihre DAO hinzuzufügen:

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

Andere Tipps

Sie haben eigentlich keine Methode Parameter verwenden, können aber Reflexion verwendet werden.

Beispiel-Code mit Reflexion

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];
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top