【问题标题】:jpa and native queriesjpa 和本机查询
【发布时间】:2012-10-09 12:22:32
【问题描述】:

我在原生查询中遇到了一件奇怪的事情:

如果我尝试使用如下命名的本机查询

@NamedNativeQuery(name = "native_count_avg_guest_quizzes", resultClass = java.math.BigDecimal.class, query = "select avg(c) as r from ((select count(*) as c from user_quiz uq join user u on (uq.user_id = u.id) where u.status = 'temporary' group by u.id) as res)")

应用程序无法运行,我有

org.hibernate.HibernateException: Errors in named queries: native_count_avg_guest_quizzes_

但是,如果我不使用 NamedNativeQuery 而只是创建如下动态本机查询,则相同的查询可以正常工作:

entityManager.createNativeQuery(
                        "select avg(c) as r from ((select count(*) as c from user_quiz uq join user u on (uq.user_id = u.id) where u.status = 'temporary' group by u.id) as res)")
                        .getSingleResult()

为什么?我对 NamedNativeQuery 做错了什么?谢谢

更新: 实体类如下

@Entity
@Table(name = "user_quiz")
@NamedNativeQueries({
    @NamedNativeQuery(name = "native_count_avg_guest_quizzes", resultClass = java.math.BigDecimal.class, query = "select avg(c) as r from ((select count(*) as c from user_quiz uq join user u on (uq.user_id = u.id) where u.status = 'temporary' group by u.id) as res)")
})
@NamedQueries({
    @NamedQuery(name = "list_clients_quizzes", query = "select uq from UserQuiz uq where uq.quiz.client.id = :clientId"),
    .......
})
public class UserQuiz extends Measurable {
.......
}

【问题讨论】:

  • 您是否将带有查询的类标记为@Entity 或@MappedSuperclass?
  • @user2800708 我做到了。问题是该课程有很多 hql 查询,这些查询没有任何问题。该问题仅发生在此本机查询中。为了以防万一,我已经用实体类定义更新了这个问题。这个想法是:如果它是动态创建的,那么完全相同的原生查询就可以正常工作。我认为问题不在于实体定义。我认为问题在于 NamedNativeQueries 的处理方式

标签: jpa nativequery


【解决方案1】:

createNativeQuery 用于原生 SQL 查询语言,这意味着 DB 可以理解并执行该查询(例如,select * from some_table where id = '0001');

可能会导致数据库依赖。现在您正在使用JPQL 语言,这就是为什么使用createQuery()createNameQuery()@NameQuery 注释。

例子:

@NameQuery

@NamedQuery(name = "findAllEmployee", query = "select e from Employee e")
@Entity
public class Employee {
    @Id int id;
    String name;
    // ...
}

Query query = em.createNamedQuery("findAllEmployee");
query.getResultList()

动态

    Query query = em.createQuery("select e from Employee e");
    query.getResultList()?

*原生

Query query = em.createNativeQuery("SELECT * FROM EMPLOYEE_TBL");
query.getResultList()?

【讨论】:

  • 不确定我理解你的意思。如果我将“本机”SQL 查询用作带有 @NamedNativeQuery 注释的命名查询,我会遇到麻烦。奇怪的是,如果我在应用程序代码中使用与entityManager.createNativeQuery(...) 完全相同的查询,它会完美运行。您能否解释一下我如何根据您的帖子找到解决问题的方法。谢谢。
【解决方案2】:

从@NamedNativeQuery 中删除 resultClass。

https://stackoverflow.com/a/9763489

对于 NamedNativeQueries,您只能在结果实际映射到实体时使用 resultClass。

【讨论】:

    猜你喜欢
    • 2016-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-11
    • 1970-01-01
    • 2014-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多