我想在我的应用程序中获取所有 NamedQueries 的列表,并且我还想在运行时一般地调用它们。是否可以选择获取列表以及某种元数据(一般来说是某种反射)?
另一个线程为 NHibernate 提供了某种解决方案......即使使用 Hibernate 作为实现,在 JPA 也找不到类似的解决方案。
提前谢谢 El Subcomandante
我想在我的应用程序中获取所有 NamedQueries 的列表,并且我还想在运行时一般地调用它们。是否可以选择获取列表以及某种元数据(一般来说是某种反射)?
另一个线程为 NHibernate 提供了某种解决方案......即使使用 Hibernate 作为实现,在 JPA 也找不到类似的解决方案。
提前谢谢 El Subcomandante
我认为没有任何东西可以一步内置。但是您可以使用 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;
}
汤姆安德森的回答有一个错误:它试图在 JPA 实现的 ManagedType 类上找到注释,而不是实际的实体类。这是更正的版本。
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.EntityManagerFactory;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.metamodel.EntityType;
private static Set<NamedQuery> findAllNamedQueries(EntityManagerFactory emf) {
Set<NamedQuery> allNamedQueries = new HashSet<NamedQuery>();
Set<EntityType<?>> entityTypes = emf.getMetamodel().getEntities();
for (EntityType<?> entityType : entityTypes) {
Class<?> entityClass = entityType.getBindableJavaType();
NamedQueries namedQueries = entityClass.getAnnotation(NamedQueries.class);
if (namedQueries != null) {
allNamedQueries.addAll(Arrays.asList(namedQueries.value()));
}
NamedQuery namedQuery = entityClass.getAnnotation(NamedQuery.class);
if (namedQuery != null) {
allNamedQueries.add(namedQuery);
}
}
return allNamedQueries;
}
这仍然是纯 JPA2。
我不明白这个问题,你已经给出了解决方案?您只需扫描类并使用反射。
这为您提供了一个类的所有注释。 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,然后简单地访问名称/查询属性。
塞巴斯蒂安