为啥元字符 * 不能在 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 为 AppEngine 中的新实体加载原始字符串?