質問

JPA の実際の例に従って、Category オブジェクトを次のように取得しました。

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

クエリは非常に簡潔です。そして、どのガイドにも何がオプションで何が含まれないのかについてのルールが見つかりません。この簡潔さは受け入れられますか?

次に、これを次のような汎用 DAO に実装したいと思います。

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

「from カテゴリ」をハードコードできないため、すべてのタイプで機能するように最初のクエリを書き直すにはどうすればよいですか?

役に立ちましたか?

解決

  1. はい、その簡潔さは許容されます。ただし、SQL の経験が豊富な他の人にとっては、完全な構文の方が「魅力的」であるため、私は完全な構文を好みます。

  2. を追加する必要があります Class<E> DAO のパラメータ:

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

他のヒント

あなたが実際にメソッドのパラメータを使用する必要はありませんが、リフレクションを使用することができます。

<のhref = "http://code.google.com/p/listwidget/source/browse/trunk/src/main/java/com/turbomanage/listwidget/server/service/ObjectifyDao.java" のrel = "nofollowを">サンプルコードリフレクションを使用して

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