Почему метасимвол * нельзя использовать в NamedQuery внутри объекта в JPA? - PullRequest
0 голосов
/ 03 ноября 2011

Я пытаюсь использовать следующий NamedQuery в моей сущности класса BrandMstr.

@NamedQuery(name = "BrandMstr.findAllBrands", query = "SELECT * FROM BrandMstr")

Выдает исключение javax.ejb.EJBException с длинной трассировкой стека, указывающей, что неожиданный токен [*] найден.


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

Collection<BrandMstr>brands=(Collection<BrandMstr>)
em.createNativeQuery("SELECT * FROM BrandMstr",BrandMstr.class).getResultList());

Где em - это объект EntityManager, аннотированный определенным PersistanceContext следующим образом

@PersistenceContext(unitName="OnlineShoppingCartSystem-ejbPU")
EntityManager em=null;

Почему метасимвол * не разрешен в NamedQuery, а то же самое можно использовать в NativeQuery? Кроме того, мы можем выполнять все большинство всех операций, используя NamedQuery, тогда почему NativeQuery? В какой конкретной ситуации следует использовать NativeQuery?

1 Ответ

3 голосов
/ 03 ноября 2011

Из документации Java EE 6 @NamedQuery:

Указывает статический именованный запрос в запросе Java Persistence язык.

Ваш запрос является собственным запросом.

Вы должны изменить его на JPQL-запрос, что-то вроде:

query="SELECT b FROM BrandMstr b"

Относительно вашего второго вопроса:

мы можем выполнять все большинство всех операций, используя NamedQuery, тогда почему NativeQuery

Используйте собственные запросы для операций, которые зависят от поставщика базы данных и не могут быть выполнены с помощью JPQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...