休眠位置参数不存在:查询中的 1

Posted

技术标签:

【中文标题】休眠位置参数不存在:查询中的 1【英文标题】:Hibernate Positional parameter does not exist: 1 in query 【发布时间】:2012-02-17 04:25:46 【问题描述】:

我正在尝试执行以下查询,但收到以下异常。

   List<Category> cats = session.createCriteria(Category.class).add(criterion).list();
    Map<Integer, CategoryNode> childNodes = new LinkedHashMap<Integer, CategoryNode>();
    for (Category cat : cats) 
        CategoryNode childNode = new CategoryNode();
        childNode.setCategory(cat);
        childNodes.put(cat.getId(), childNode);
    
    StringBuilder questions = new StringBuilder();
    for (int i = 0; i < childNodes.size(); ++i) 
        if (i != 0) 
            questions.append(", ");
        
        questions.append("?");
    


    Query query = session.createSQLQuery(
            "select c1.id, count(c2.id) "
            + "from CATEGORY c1 "
            + "left join CATEGORY c2 on c2.parentCategoryId = c1.id "
            + "where c1.id in (" + questions + ") "
            + "group by c1.id");

    int i = 0;

    for (Iterator<CategoryNode> it = childNodes.values().iterator(); i < childNodes.size(); ++i) 
        query.setLong(i + 1, it.next().getCategory().getId());
    

位置参数不存在:查询中的1:选择c1.id, count(c2.id) from CATEGORY c1 left join CATEGORY c2 on c2.parentCategoryId = c1.id where c1.id in (?) group by c1.id

【问题讨论】:

你也可以发布下一行代码吗?变量questions 是逗号分隔的字符串吗? 大家好,谢谢,是的,问题是一个逗号分隔的字符串。我在上面发布了整个查询。对此的任何帮助将不胜感激。 【参考方案1】:

位置参数从0开始,所以可能需要把设置代码改成这个

for (Iterator<CategoryNode> it = childNodes.values().iterator(); i < childNodes.size(); i++) 
    query.setLong(i, it.next().getCategory().getId());

【讨论】:

【参考方案2】:

看起来 hibernate 期望你设置一个参数,因为 questions 是一个问号:

where c1.id in (?)

不太了解hibernate,但我想您可以将questions 设置为实际包含一个值,例如questions = '1, 2, 3';,以便查询被替换为:

where c1.id in (1, 2, 3)

或者也许,我认为这将是适当的方式(如果 hibernate 支持这一点!)使用查询:

where c1.id in (?)

然后从休眠中调用一个方法来替换它?使用您在 php.ini 中设置的参数。大概是这样的吧?

query.setString(0, questions);

希望这会有所帮助,乔治。

【讨论】:

您好 Mostacho,我正在使用您的第二个建议。我将在我的帖子中添加查询的其余部分。见上文。

以上是关于休眠位置参数不存在:查询中的 1的主要内容,如果未能解决你的问题,请参考以下文章

JPA 查询参数在 Hibernate 中的位置?

横向解决方法:将参数从查询中的其他位置传递给集合返回函数

如何将 linq 中的参数类型设置为 char(*) 类型的休眠查询?

如何将值列表设置为休眠查询的参数?

Oracle12c多租户CDB 与 PDB 参数文件位置探讨查询 CDB 与 PDB 不同值的参数

Python中的函数参数:位置参数默认参数可变参数关键字参数和命名关键字参数