استعلام jpql حدد اختياري + عام 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(); }
نصائح أخرى
في الواقع ، ليس عليك استخدام معلمة الطريقة ، ولكن يمكنك استخدام التفكير.
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];
}
}
لا تنتمي إلى StackOverflow