【问题标题】: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?

【问题讨论】:

    标签: jpa jpa-2.0


    【解决方案1】:

    来自@NamedQuery 的 Java EE 6 文档:

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

    您的查询是本机查询。

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

    query="SELECT b FROM BrandMstr b"
    

    关于你的第二个问题:

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

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

    【讨论】:

      猜你喜欢
      • 2011-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-04
      • 1970-01-01
      • 2014-09-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多