Hibernate / JPA - исключение NullPointerException при доступе к параметру SingularAttribute

Я пытаюсь использовать типобезопасные критерии JPA2 с Hibernate 5.0.7.Final.

...
criteria.where( builder.equal( root.get(SingularAttribute.attr), value ));
//where parameters are
//criteria.where( builder.equal( root.get(Person_.name), "Can" ));
...

Root.get всегда кидаетNullPointerException, Класс метамоделиPerson_ заPerson генерируетсяorg.hibernate.jpamodelgen.JPAMetaModelEntityProcessor.

Аналогичная проблема была задана вНе заполнены атрибуты статической метамодели JPA / Hibernate - NullPointerException но на этот раз оба класса находятся в одном пакете.

Трассировки стека:

java.lang.NullPointerException
at org.hibernate.jpa.criteria.path.AbstractPathImpl.get(AbstractPathImpl.java:123)

Мой код:

Интерфейс, который я использую, чтобы убедиться, что они будут иметьgetId();.

package it.unibz.db.hibernate.model;

public interface ModelInterface<PK extends Serializable> extends Serializable {
    PK getId();
}

Модельный класс

package it.unibz.db.hibernate.model;

@Entity
@Table(name ="person")
public class Person implements ModelInterface<Integer> {
    @Id
    private Integer id;
    private String name;

    public Integer getId() {
        return id;
    }
    //other getter and setters
}

Сгенерированная метамодель Person_ class

package it.unibz.db.hibernate.model;

@Generated(value = "org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor")
@StaticMetamodel(Person.class)
public abstract class Person_ {

    public static volatile SingularAttribute<Person, String> name;
    public static volatile SingularAttribute<Person, Integer> id;

}

Общий класс DAO, который я наследую с PersonDao

public class GenericDao<E extends ModelInterface<PK>, PK extends Serializable> implements DaoInterface<E, PK> {
private Class<E> type;

public GenericDao(Class<E> type) {
    this.type = type;
    //called as super(ClassName.class); eg. super(Person.class);
}

public List<E> readBy(SingularAttribute column, String value) throws Exception {
    EntityManager em = HibernateUtil.getEntityManager();
    CriteriaBuilder builder = em.getCriteriaBuilder();
    CriteriaQuery<E> criteria = builder.createQuery(type);
    Root<E> root = criteria.from(type);

    criteria.select(root);
    criteria.where( builder.equal( root.get(column), value ));
    List<E> entityList = em.createQuery(criteria).getResultList();
    em.close();
    return entityList;
    }
}

Некоторые из моих зависимостей

hibernate-c3p0 5.0.7.Final

hibernate-entitymanager 5.0.7.Final

postgresql 9.4.1207.jre7

hibernate-jpamodelgen 5.0.7.Final

РЕДАКТИРОВАТЬ:

Запуск этого кода в основном методе работает

EntityManager em = HibernateUtil.getEntityManager();
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<Person> criteria = builder.createQuery(Person.class);
Root<Person> root = criteria.from(Person.class);
criteria.select(root);
criteria.where( builder.equal( root.get(Person_.name), "Can" ));
List<Person> entityList = em.createQuery(criteria).getResultList();
//do stuff with entityList

но тот же код, покрытый в методе бросаетNullPointerException.

public List<Person> readBy(SingularAttribute column, String value) throws Exception {
    log.debug("Reading entity by");

    EntityManager em = HibernateUtil.getEntityManager();
    CriteriaBuilder builder = em.getCriteriaBuilder();
    CriteriaQuery<Person> criteria = builder.createQuery(Person.class);
    Root<Person> root = criteria.from(Person.class);

    criteria.select(root);
    criteria.where( builder.equal( root.get(column), value ));
    List<Person> entityList = em.createQuery(criteria).getResultList();
    em.close();
    return entityList;
}

Так что, похоже, проблема проходитSingularAttribute параметр методаreadBy(SingularAttribute column, String value).

Я проверил этот код в основном, и это печатаетfalse

EntityManager em = HibernateUtil.getEntityManager();
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<Person> criteria = builder.createQuery(Person.class);
Root<Person> root = criteria.from(Person.class);
System.out.println(root.get(Person_.name) == null); //false

Между тем это бросаетInvocationTargetException вызванныйNullPointerException вroot.get(column).

//invoked as personDao.test(Person_.name) from main
public void test(SingularAttribute column) {
    EntityManager em = HibernateUtil.getEntityManager();
    CriteriaBuilder builder = em.getCriteriaBuilder();
    CriteriaQuery<Person> criteria = builder.createQuery(Person.class);
    Root<Person> root = criteria.from(Person.class);
    System.out.println(root.get(column) == null); //InvocationTargetException
}

Это то, что он должен делать? Как я могу пройтиSingularAttribute объект к методу в качестве параметра?

Ответы на вопрос(1)

Ваш ответ на вопрос