JPQL Abfrage SELECT optional + generische DAO wählen
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“ ..?
Lösung
-
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.
-
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.
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];
}
}