我想获取我的应用程序中所有NamedQueries的列表,我也想在运行时以一般方式调用它们。是否可以选择获取列表以及某种元数据(通常来说是某种反射)?

另一个线程为NHibernate提供了某种解决方案...即使使用Hibernate作为实现,在JPA上也找不到类似的解决方案。

提前Thx
埃尔·苏孔康德

最佳答案

我认为没有什么可以一步一步完成的。但是您可以使用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;
}

10-06 01:18