2014-01-10 4 views
0

Я не могу преобразовать простой Query в @NamedQuery. Я что-то пропустил в следующем коде?Как конвертировать запрос в NamedQuery?

//works fine 
em.createQuery("FROM Person p WHERE p.name = :name").setParameter("name", name).getResultList(); 

//throws exception 
em.createQuery(Person.FIND_BY_ID).setParameter("name", name).getResultList(); 
@NamedQueries({ 
    @NamedQuery(
     name = BookingRequest.FIND_BY_ID, 
     query = "FROM Person p WHERE p.name = :name" 
    ) 
}) 
class Person { 
    public static final String FIND_BY_ID = "Person.findById"; 
} 

Ошибка:

java.lang.IllegalArgumentException: node to traverse cannot be null! 
    at org.hibernate.hql.internal.ast.util.NodeTraverser.traverseDepthFirst(NodeTraverser.java:65) 
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:274) 
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:182) 
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:138) 
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:105) 
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:80) 
    at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:168) 
    at org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:222) 
    at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:200) 
    at org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1703) 
    at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:291) 

ответ

0

Вы должны использовать

em.createNamedQuery("query name") ... 
+1

СПЗ, у меня нет 'em.getNamedQuery()' ..., я использую 'javax.persistence. EntityManager' – membersound

+0

, если у вас есть импорт javax.persistence.EntityManager; вы должны использовать его – kai

+0

Я не вижу этого в документах: http://docs.oracle.com/javaee/7/api/javax/persistence/EntityManager.html, я думаю, что getNamedQuery предназначен только для сеанса Hibernate. – membersound

Смежные вопросы