jpa选择无法正常工作

时间:2011-12-13 13:01:04

标签: java jpa ejb-3.0

select id,name,amount,sort 
from 
(select id,name,amount,sort,gift_id,count(gift_id) 
from 
(select * from t_lpw_gift g join t_lpw_dianxin_gift d on g.id=d.gift_id) 
group by gift_id,id,name,amount,sort order by count(gift_id) desc) 
where rownum <=5;

如何使用jpa createNativeQuery来选择,数据库是oracle

表:

SQL> desc t_lpw_gift;
Name   Type         Nullable Default Comments 
------ ------------ -------- ------- -------- 
ID     INTEGER                                
NAME   VARCHAR2(32)                           
PRICE  NUMBER                                 
AMOUNT INTEGER                                
SORT   VARCHAR2(32) Y                         

SQL> desc t_lpw_dianxin_gift;
Name        Type    Nullable Default Comments 
----------- ------- -------- ------- -------- 
GIFT_ID     INTEGER                           
DIANXIN_ID  INTEGER                           
GIFT_NUMBER INTEGER Y  

返回实体是t_lpw_gift

public List<Gift> getHotGifts(int topHotGiftsNum) {
    String sql = "select id,name,amount,sort from (select id,name,amount,sort,gift_id,count(gift_id) from (select * from t_lpw_gift g join t_lpw_dianxin_gift d on g.id=d.gift_id) group by gift_id,id,name,amount,sort order by count(gift_id) desc) where rownum <= :topHotGiftsNum";
return (List<Gift>)em.createNativeQuery(sql,Gift.class).setParameter("topHotGiftsNum", topHotGiftsNum).getResultList();
}

18:55:11,473 WARN [org.hibernate.util.JDBCExceptionReporter] SQL错误:17006,SQLState:99999 18:55:12,992 ERROR [org.hibernate.util.JDBCExceptionReporter]列名无效()

2 个答案:

答案 0 :(得分:1)

在JPA中的本机SQL参数上,您需要使用位置参数而不是命名参数。根据规范不支持命名参数。

因此,将:topHotGiftsNum更改为?1setParameter(1, topHotGiftsNum)

请参阅this answer

编辑:好的,那不是它。这应该是:select子句缺少实体的某些属性,或者select子句中的一个列是错误输入的。您的select子句需要包含实体中的所有列,而名称没有任何区别。根据{{​​3}}。

答案 1 :(得分:0)

@Kent的评论让我搜索关键字: http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/reservewords.htm

似乎 NAME 可能是保留字的罪魁祸首。没有意识到这一点(总是使用SURNAME等)。 但是NAME应该是允许的。尝试引用NAME和SORT。