我正在尝试在实体类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?
答案 0 :(得分:3)
来自@NamedQuery
的Java EE 6文档:
在Java Persistence查询中指定静态的命名查询 语言。
您的查询是原生查询。
您应该将其更改为JPQL查询,例如:
query="SELECT b FROM BrandMstr b"
关于你的第二个问题:
我们可以使用NamedQuery执行所有大多数操作,那么为什么 NativeQuery?
对于特定于数据库供应商的操作使用本机查询,而不能使用JPQL。