8

not all named parameters have been set というエラーが表示されます。以下は私のコードです。

mysqlプロンプトで正常に実行されている私のSqlQuery、質問SQLクエリでスキーマを参照できます

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)

前もって感謝します...

4

1 に答える 1

16

:=問題は、ちなみに標準 SQL ではない での代入です。

SQL では、inや :param の:ように、常にパラメーターが必要です。その場合、パラメーターとして設定する必要があります。where value = :param現在、休止状態は、設定されたパラメーターが続かない select および find コロンをスキャンしています。

解決策: 休止状態の標準を使用して選択を再設計します。

2 つの異なる HQL クエリを使用できます。

最初: すべての製品を選択:select distinct product from Table1

2番目:実行する製品ごとfrom Table1 where product = :prodに、 :prod を実際の製品のパラメーターとして設定し、 setMaxResults(2) を使用して、必要に応じて行数を制限できます。

現在では、単一の選択ではなく多数の選択が行われていますが、単一のクエリよりも高速である可能性があります (単一のクエリは複雑であり、データベースでの非効率的な検索戦略になるリスクがあります)。そして大きな利点は、純粋に HQL であるため、プログラムをさまざまなデータベースに移植できることです。

于 2012-09-27T07:46:12.747 に答える