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

Posted

技术标签:

【中文标题】为啥元字符 * 不能在 JPA 的实体中的 NamedQuery 中使用?【英文标题】:Why can't the meta character * be used in NamedQuery within an entity in JPA?为什么元字符 * 不能在 JPA 的实体中的 NamedQuery 中使用? 【发布时间】:2011-12-20 22:31:43 【问题描述】:

我正在尝试在我的 entity 类 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】:

来自@NamedQuery 的 Java EE 6 文档:

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

您的查询是本机查询。

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

query="SELECT b FROM BrandMstr b"

关于你的第二个问题:

我们可以使用 NamedQuery 执行几乎所有的操作,那么为什么 原生查询?

对特定于数据库供应商且无法使用 JPQL 完成的操作使用本机查询。

【讨论】:

以上是关于为啥元字符 * 不能在 JPA 的实体中的 NamedQuery 中使用?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在看到 PersistentBag 的实体中使用 JPA 列出(@OneToMany)

JPA,映射实体人,其中包含名称类型的类

未使用的 JPA 实体是不是被垃圾回收?为啥?

投影查询:如何使用 JPA 为 AppEngine 中的新实体加载原始字符串?

为啥在 JPA 2/Hibernate 中使用共享主键时实体需要可序列化?

Spring JPA - 找不到实体管理器工厂,为啥?