سؤال

لقد اتبعت مثال 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();
    }
    

نصائح أخرى

في الواقع ، ليس عليك استخدام معلمة الطريقة ، ولكن يمكنك استخدام التفكير.

مثال رمز باستخدام الانعكاس

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