Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jakarta ee 如何获取持久对象的属性映射值?_Jakarta Ee_Jpa_Persistence_Metamodel - Fatal编程技术网

Jakarta ee 如何获取持久对象的属性映射值?

Jakarta ee 如何获取持久对象的属性映射值?,jakarta-ee,jpa,persistence,metamodel,Jakarta Ee,Jpa,Persistence,Metamodel,我有一个持久对象(Action)和自动生成的数据模型(Action)。通过拥有Action类的对象和SingularAttribute的实例,是否有可能获得与给定SingularAttribute对应的字段 我需要这样一个函数: public S getValue(T object,SingularAttribute<T,S> attribute); 我的元模型类(Action.java): @StaticMetamodel(Action.class) 公共集体诉讼{ 公共静态属性

我有一个持久对象(Action)和自动生成的数据模型(Action)。通过拥有Action类的对象和SingularAttribute的实例,是否有可能获得与给定SingularAttribute对应的字段

我需要这样一个函数:

public S getValue(T object,SingularAttribute<T,S> attribute);
我的元模型类(Action.java):

@StaticMetamodel(Action.class)
公共集体诉讼{
公共静态属性id;
公共静态属性名;
}

您可以使用
getJavaMember()
方法获取成员,然后测试该成员是
字段还是
方法,并使用反射访问该字段或调用对象上的方法

在访问/调用字段或方法之前,可能必须使其可访问。您还必须处理到对象的基元类型转换

主要问题是:你为什么需要这个

如果仅此特定实体类需要它,只需在属性名称上使用开关并返回适当的值:

switch (attribute.getName()) {

    case "name":
        return action.getName();
    ...
}

正如JB Nizet所建议的,您可以使用
getJavaMember
。我发现我不需要将私有字段设置为可访问的,也许Hibernate已经这样做了

如果这有帮助,下面是一些适合我的代码:

/**
 * Fetches the value of the given SingularAttribute on the given
 * entity.
 *
 * @see http://stackoverflow.com/questions/7077464/how-to-get-singularattribute-mapped-value-of-a-persistent-object
 */
@SuppressWarnings("unchecked")
public static <EntityType,FieldType> FieldType getValue(EntityType entity, SingularAttribute<EntityType, FieldType> field) {
    try {
        Member member = field.getJavaMember();
        if (member instanceof Method) {
            // this should be a getter method:
            return (FieldType) ((Method)member).invoke(entity);
        } else if (member instanceof Field) {
            return (FieldType) ((Field)member).get(entity);
        } else {
            throw new IllegalArgumentException("Unexpected java member type. Expecting method or field, found: " + member);
        }
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}
/**
*获取给定对象上给定属性的值
*实体。
*
*@见http://stackoverflow.com/questions/7077464/how-to-get-singularattribute-mapped-value-of-a-persistent-object
*/
@抑制警告(“未选中”)
公共静态字段类型getValue(EntityType实体,SingularAttribute字段){
试一试{
Member=field.getJavaMember();
if(方法的成员实例){
//这应该是一种getter方法:
返回(FieldType)((方法)成员)。调用(实体);
}else if(成员实例字段){
返回(字段类型)((字段)成员).get(实体);
}否则{
抛出新的IllegalArgumentException(“意外的java成员类型。应为方法或字段,找到:“+member”);
}
}捕获(例外e){
抛出新的运行时异常(e);
}
}

感谢您的快速回复。我想创建一个通用类,它应该能够处理任何给定的持久对象(通过使用元模型)。例如,用于表示任何数据库表的类。使用getJavaMember()函数似乎是唯一的方法,但由于所有持久化对象都应该为其字段提供getter方法,因此我希望API能够提供获取所有字段的功能(如果需要,在内部使用getter方法)。它可以工作。正如我所期望的,SingularAttribute根据@Column的设置位置返回方法或字段的实例。再次感谢!JPA不是提供对象字段的值,而是持久化/检索对象。正如回答所说的,使用Java反射。很好的解决方案。我们已经很容易地派生出EntityAttributeCollection,因此我们能够在现有集合中迭代实体的属性。这一个很棒!我可以轻松地在JSF中创建一个新列,而无需添加太多代码!
switch (attribute.getName()) {

    case "name":
        return action.getName();
    ...
}
/**
 * Fetches the value of the given SingularAttribute on the given
 * entity.
 *
 * @see http://stackoverflow.com/questions/7077464/how-to-get-singularattribute-mapped-value-of-a-persistent-object
 */
@SuppressWarnings("unchecked")
public static <EntityType,FieldType> FieldType getValue(EntityType entity, SingularAttribute<EntityType, FieldType> field) {
    try {
        Member member = field.getJavaMember();
        if (member instanceof Method) {
            // this should be a getter method:
            return (FieldType) ((Method)member).invoke(entity);
        } else if (member instanceof Field) {
            return (FieldType) ((Field)member).get(entity);
        } else {
            throw new IllegalArgumentException("Unexpected java member type. Expecting method or field, found: " + member);
        }
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}