我收到错误并未设置所有已命名的参数。以下是我的代码。
我的SqlQuery在mysql提示符下正常运行,您可以在问题SQL Query中引用模式
SELECT t.*
FROM (
SELECT @lim := 2,
@cg := ''
) vars,
(select * from Table1 order by product,amount, make) t
WHERE CASE WHEN @cg <> product THEN @r := @lim ELSE 1 END > 0
AND (@r := @r - 1) >= 0
AND (@cg := product) IS NOT NULL
ORDER BY
product,amount, make
我的java代码
try {
context.dbl.startTransaction();
Session session = context.dbl.getSession();
//String sqlQuery = "from com.infibeam.inventoryservice.dbObjects.PopularBrandDO";
String sqlQuery = "SELECT t.* ";
sqlQuery=sqlQuery + "FROM (";
sqlQuery=sqlQuery + "SELECT @lim := 2,";
sqlQuery=sqlQuery + "@cg := ''";
sqlQuery=sqlQuery + ") vars, ";
sqlQuery=sqlQuery + "(select * from Table1 order by product,amount, make) t";
sqlQuery=sqlQuery + " WHERE CASE WHEN @cg <> product THEN @r := @lim ELSE 1 END > 0";
sqlQuery=sqlQuery + " AND (@r := @r - 1) >= 0 ";
sqlQuery=sqlQuery + " AND (@cg := product) IS NOT NULL ";
sqlQuery=sqlQuery + " ORDER BY product,amount, make";
//Query query = session.createQuery(sqlQuery);
SQLQuery query = session.createSQLQuery(sqlQuery);
listItems = query.list();
}catch(RuntimeException e) {
e.printStackTrace();
}
以下是我得到的例外
org.hibernate.QueryException: Not all named parameters have been set: [] [SELECT t.* FROM (SELECT @lim := 2,@cg := '') vars, (select * from Table1 order by product,amount, make) t WHERE CASE WHEN @cg <> product THEN @r := @lim ELSE 1 END > 0 AND (@r := @r - 1) >= 0 AND (@cg := product) IS NOT NULL ORDER BY product,amount, make]
at org.hibernate.impl.AbstractQueryImpl.verifyParameters(AbstractQueryImpl.java:291)
at org.hibernate.impl.SQLQueryImpl.verifyParameters(SQLQueryImpl.java:199)
at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:143)
at com.infibeam.weaverbird.helper.PopularBrandFacetHelper.bootstrap(PopularBrandFacetHelper.java:48)
提前致谢...
答案 0 :(得分:14)
问题是使用:=
进行分配,这种分配不是标准SQL。
在:
之后的SQL中,总是需要一个参数,就像在where value = :param
中一样,并且:param可以设置为参数。现在,hibernate正在扫描select并找到没有设置参数的冒号。
解决方案:使用休眠标准重新设计您的选择。
您可以使用两种不同的HQL查询。
首先:选择所有产品:select distinct product from Table1
第二:对于您执行from Table1 where product = :prod
的每个产品,:prod您设置为实际产品的参数,并且使用setMaxResults(2),您可以根据需要限制行数。
现在它有很多选择而不是单个选项,但是它们可能比单个查询更快(单个查询很复杂并且存在数据库中低效搜索策略的风险)。这是一个很大的优势,现在它纯粹是HQL,所以你的程序可以移植到不同的数据库。