为什么不能在JPA中的实体中的NamedQuery中使用元字符*?

时间:2011-11-03 07:14:51

标签: jpa jpa-2.0

我正在尝试在实体类BrandMstr中使用以下NamedQuery。

@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是使用特定PersistanceContext注释的EntityManager对象,如下所示

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

为什么NamedQuery中不允许使用元字符*,而在NativeQuery中可以使用相同的元字符?另外,我们可以使用NamedQuery执行所有大多数操作,那么为什么使用NativeQuery?在哪种特殊情况下,应该使用NativeQuery?

1 个答案:

答案 0 :(得分:3)

来自@NamedQuery的Java EE 6文档:

  

在Java Persistence查询中指定静态的命名查询   语言。

您的查询是原生查询。

您应该将其更改为JPQL查询,例如:

query="SELECT b FROM BrandMstr b"

关于你的第二个问题:

  

我们可以使用NamedQuery执行所有大多数操作,那么为什么   NativeQuery?

对于特定于数据库供应商的操作使用本机查询,而不能使用JPQL。