java - 通过循环列表从 JPA 元模型获取 SingularAttribute

标签 java jpa

我有一个 JPA 元模型,可以从中检索属性。

@StaticMetamodel(Test.class)
public class Test_{
    public static volatile SingularAttribute<Test, Boolean> var1;
    public static volatile SingularAttribute<Test, Boolean> var2;
    public static volatile SingularAttribute<Test, Boolean> var3;
}

我可以手动调用和使用它们:

Test_.var1
Test_.var2
Test_.var3

但是我怎样才能通过循环列表来做到这一点:

List<String> vars = new ArrayList<String>();
vars.add("var1");
vars.add("var2");
vars.add("var3");

for (int i=0; i < vars.size(); i++) {
    String var = vars.get(i).toString();
    System.out.println(var); // prints: var1, var2, var3

    // How? (s. update below)

}

如何使用字符串 var 从元模型获取属性。

<小时/>

更新

我尝试按照@naXa的建议使用java反射在循环内但没有成功:

// suppose to be
System.out.println(Test_.var1); // com.example.entities.Test.var1
System.out.println(Test_.var1.getType()); // boolean
// looping through list
Class object = Test_.class;   
try {
    Field field = object.getDeclaredField(var);    
    field.setAccessible(true); // public static volatile javax.persistence.metamodel.SingularAttribute com.example.entities.Test.var1
    System.out.println(field); // com.example.entities.Test.var1
    System.out.println(field.getType()); // interface javax.persistence.metamodel.SingularAttribute
    // but <field> is still no Expression <Boolean>
} catch(NoSuchFieldException e) {
    System.out.println("Error"); 
}

它不会返回正确的名称或类型(请参阅代码中的输出注释)。

最佳答案

在您的反射代码中,您直接使用该字段,但这不是您正在寻找的静态 SingularAttribute (Test_.var1) 值。您需要使用 field.get(null)

获取实际的静态值
Field[] fields = Test_.class.getDeclaredFields();
for (Field field : fields) {
    if (Modifier.isPublic(field.getModifiers())) {
        // For Each Public Field
        try {
            Object obj = field.get(null); // Equivalent to Test_.var1 but you need to cast it
            if (obj instanceof SingularAttribute) {
                System.out.println(obj); // Equivalent to Test_.var1
                System.out.println(SingularAttribute.class.cast(obj).getType()); // Equivalent to Test_.var1.getType()
            }
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}

关于java - 通过循环列表从 JPA 元模型获取 SingularAttribute,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44894711/

相关文章:

java - Hibernate @OneToOne 自连接,在连接子句中使用 OR

java - 元语言,如 BNF 或 XML-Schema,用于根据树模型验证树实例

java - Java 中的字符串解析 - 我该怎么做?

java - Apache StringUtils 中的异常

java - 防止 MigLayout 组件间隔开

Java spring 排序和过滤

java - EclipseLink - 双向 OneToMany 关系

javascript - 在 Javascript 中加密并在 Java 中解密 Zip 文件

java - cassandra - 高并发读写应用程序问题

java - Spring jpa使用自定义Query时抛出ClassCastException