gpt4 book ai didi

java - 并非所有命名参数都已在 createSQLQuery 中设置为 hibernate

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:07:28 24 4
gpt4 key购买 nike

我收到未设置所有命名参数的错误。下面是我的代码。

我的 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)

提前致谢...

最佳答案

问题是 := 的分配问题,顺便说一下,这不是标准的 SQL。

: 之后的 SQL 中总是需要一个参数,比如 where value = :param然后 :param 被设置为参数。现在 hibernate 正在扫描选择并查找后面没有设置参数的冒号。

解决方案:使用 hibernate 标准重新设计您的选择。

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

首先:选择所有产品:select distinct product from Table1

其次:对于你做的每件产品from Table1 where product = :prod , :prod 您设置为实际产品的参数,使用 setMaxResults(2) 您可以根据需要限制行数。

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

关于java - 并非所有命名参数都已在 createSQLQuery 中设置为 hibernate ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12615771/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com