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]列名无效()
答案 0 :(得分:1)
在JPA中的本机SQL参数上,您需要使用位置参数而不是命名参数。根据规范不支持命名参数。
因此,将:topHotGiftsNum
更改为?1
和setParameter(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。