JPQL クエリ SELECT オプション + 汎用 DAO 選択
質問
JPA の実際の例に従って、Category オブジェクトを次のように取得しました。
return (ArrayList<Category>) getEntityManager().createQuery("from Category").getResultList();
クエリは非常に簡潔です。そして、どのガイドにも何がオプションで何が含まれないのかについてのルールが見つかりません。この簡潔さは受け入れられますか?
次に、これを次のような汎用 DAO に実装したいと思います。
public interface DAO<E, K>
{
List<E> getAll();
}
「from カテゴリ」をハードコードできないため、すべてのタイプで機能するように最初のクエリを書き直すにはどうすればよいですか?
解決
はい、その簡潔さは許容されます。ただし、SQL の経験が豊富な他の人にとっては、完全な構文の方が「魅力的」であるため、私は完全な構文を好みます。
を追加する必要があります
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];
}
}
所属していません StackOverflow