アプリケーション内のすべての NamedQueries のリストを取得し、実行時にそれらを一般的に呼び出したいと考えています。リストとある種のメタデータ (一般的にはある種のリフレクション) を取得するオプションはありますか?
別のスレッドは、NHibernate に何らかのソリューションを提供しました... Hibernate を実装として使用しても、JPA で同様のものを見つけることができません。
事前にThx El Subcomandante
アプリケーション内のすべての NamedQueries のリストを取得し、実行時にそれらを一般的に呼び出したいと考えています。リストとある種のメタデータ (一般的にはある種のリフレクション) を取得するオプションはありますか?
別のスレッドは、NHibernate に何らかのソリューションを提供しました... Hibernate を実装として使用しても、JPA で同様のものを見つけることができません。
事前にThx El Subcomandante
組み込まれている1つのステップでそれを行うものはないと思います。しかし、JPA2のメタモデルに加えて、いくつかの簡単な考察を使用してそれを行うことができます。
private static Set<NamedQuery> findAllNamedQueries(EntityManagerFactory emf) {
Set<NamedQuery> allNamedQueries = new HashSet<NamedQuery>();
Set<ManagedType<?>> managedTypes = emf.getMetamodel().getManagedTypes();
for (ManagedType<?> managedType: managedTypes) {
if (managedType instanceof IdentifiableType) {
@SuppressWarnings("rawtypes")
Class<? extends ManagedType> identifiableTypeClass = managedType.getClass();
NamedQueries namedQueries = identifiableTypeClass.getAnnotation(NamedQueries.class);
if (namedQueries != null) {
allNamedQueries.addAll(Arrays.asList(namedQueries.value()));
}
NamedQuery namedQuery = identifiableTypeClass.getAnnotation(NamedQuery.class);
if (namedQuery != null) {
allNamedQueries.add(namedQuery);
}
}
}
return allNamedQueries;
}
質問の意味がわかりません。すでに解決策を示していますか? クラスをスキャンしてリフレクションを使用するだけです。
これにより、クラスのすべての注釈が得られます。 http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html#getAnnotations%28%29
そのリストを繰り返し処理して NamedQueries を取得します。すべてのクラスをスキャンする必要はないと思います。persistance.xml ファイルを読み、定義済みのエンティティのみをスキャンすれば十分です。
詳細な例を次に示します: http://tutorials.jenkov.com/java-reflection/annotations.html
Annotation を NamedQuery にキャストしてから、名前/クエリ属性に簡単にアクセスできるはずです。
セバスチャン