Как получить сопоставленное значение SingularAttribute постоянного объекта? - PullRequest
10 голосов
/ 16 августа 2011

У меня есть постоянный объект (Action) и автоматически сгенерированная модель данных (Action_).Имея объект класса Action и экземпляр SingularAttribute, возможно ли получить поле, соответствующее данному SingularAttribute?

Мне нужна функция, подобная этой:

public S getValue(T object,SingularAttribute<T,S> attribute);

Моя сущностькласс (Action.java):

@Entity
@Table(name="ACTION")
public class Action implements Serializable {
    private long id;
    private String name;

    public Action() {
    }


    @Id
    @Column(unique=true, nullable=false, precision=6)
    public long getId() {
        return this.id;
    }

    public void setId(long id) {
        this.id = id;
    }


    @Column(length=50)
    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

Мой класс метамодели (Action_.java):

@StaticMetamodel(Action.class)
public class Action_ {
    public static volatile SingularAttribute<Action, Long> id;
    public static volatile SingularAttribute<Action, String> name;
}

Ответы [ 2 ]

10 голосов
/ 20 февраля 2012

Как предложил JB Nizet, вы можете использовать getJavaMember.Я обнаружил, что мне не нужно устанавливать доступ к закрытым полям, возможно, Hibernate уже сделал это.

Если это полезно, вот код, который работает для меня:

/**
 * Fetches the value of the given SingularAttribute on the given
 * entity.
 *
 * @see /7445272/kak-poluchit-sopostavlennoe-znachenie-singularattribute-postoyannogo-obekta
 */
@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);
    }
}
5 голосов
/ 16 августа 2011

Вы можете использовать метод getJavaMember() для получения члена, а затем проверить, является ли этот член Field или Method, и получить доступ к полю или вызвать метод объекта, используя отражение.

Вам, вероятно, придется сделать поле или метод доступным, прежде чем получить к нему доступ или вызвать его.И вам также придется обрабатывать примитивные преобразования типов в объекты.

Основной вопрос: зачем вам это нужно?

Если вам это нужно только для этого конкретного класса сущностей, вы можете простоиспользуйте переключатель на имени атрибута и верните соответствующее значение:

switch (attribute.getName()) {

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