并非所有命名参数都在createSQLQuery中设置了hibernate

mah*_*esh 7 java struts hibernate

我收到错误,并未设置所有已命名的参数.以下是我的代码.

我的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
Run Code Online (Sandbox Code Playgroud)

我的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();
            }
Run Code Online (Sandbox Code Playgroud)

以下是我得到的例外情况

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)
Run Code Online (Sandbox Code Playgroud)

提前致谢...

Joh*_*nna 15

问题是分配:=,这是没有标准的SQL.

在SQL之后:总是需要一个参数,比如in where value = :param和:param然后被设置为参数.现在,hibernate正在扫描select并找到没有设置参数的冒号.

解决方案:使用休眠标准重新设计您的选择.

您可以使用两个不同的HQL查询.

第一:选择所有产品: select distinct product from Table1

第二:对于您执行的每个产品from Table1 where product = :prod,:您将实际产品设置为参数,使用setMaxResults(2)可以根据需要限制行数.

现在它有很多选择而不是单个选择,但是它们可能比单个查询更快(单个查询很复杂并且存在数据库中低效搜索策略的风险).而且一个很大的优势,现在它纯粹是HQL,所以你的程序可以移植到不同的数据库.