2012-10-18 106 views
2

我面临着与本地查询一个奇怪的事情:JPA和原生查询

如果我想使用一个名为原生查询像下面

@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 { 
....... 
} 
+0

你是否将类标记为@Entity或@MappedSuperclass? – user2800708

+0

@ user2800708我做到了。事情是这个类有很多hql查询没有任何问题。这个问题只发生在这个本地查询中。我已经用实体类定义更新了这个问题以防万一。这个想法是:如果原生查询是动态创建的,则完全相同。我认为问题不在于实体定义。我认为问题出在NamedNativeQueries处理的方式 – jjd

回答

4

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

它可能会导致数据库依赖。现在你用的是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()? 
+0

不确定我了解你。如果我通过'@ NamedNativeQuery'注释将它用作命名查询,那么我遇到了'本机'SQL查询的麻烦。奇怪的是,如果我使用'entityManager.createNativeQuery(...)'的应用程序代码完全使用相同的查询权限,它可以完美地工作。你能解释一下我怎么能找到一种方法来解决我的问题根据您的帖子。谢谢。 – jjd