【问题标题】:HQL Select with an OR带 OR 的 HQL 选择
【发布时间】:2016-06-14 14:41:30
【问题描述】:

所以我正在尝试使用 HQL 执行 Select 语句。

选择看起来像这样:

        queryParams[1] = new QueryParameter("clientObj", client); // Use Client as obj in hql
        queryParams[0] = new QueryParameter("clientIDObj", client.ID);

        if (!includeClosedSubTasks)
        {
            // tasks that aren't completed / closed / cancelled
            qryString = "select st
                         from SubTask st
                         where st.ParentTask.ParentProject.ParentClient=:clientObj
                         and st.ParentTaskCategory.VisibleToClient=1 "
                         + filter + // more ands
                        "and st.ParentTaskStatus.ID != 3
                         and st.ParentTaskStatus.ID != 4 and st.ParentTaskStatus.ID != 8
                         or st.RaisedByClientID=:clientIDObj
                         order by st.CreateDateTime";
        }

简单来说,应该是这样的:

选择 (a AND b AND c) OR (d) ORDER BY ...

但是,当我执行这段代码时,我得到一个带有这个内部异常的查询语法错误:

{"索引超出范围。必须为非负数且小于集合的大小。\r\n参数名称:索引"}

我该如何解决这个问题?

【问题讨论】:

    标签: c# nhibernate hql


    【解决方案1】:

    我认为问题不在于查询,而在于 queryParams 数组。您不能像这样将添加到空列表项:

    queryParams[1] = new QueryParameter("clientObj", client); // Use Client as obj in hql
    

    除此之外,请始终尝试使用列表的 .Add 方法。

    尝试像这样重写整个块:

    if (!includeClosedSubTasks)
    {
        // TODO get session here somehow as you do normally
        var session = NHSession.GetCurrent();
    
        // tasks that aren't completed / closed / cancelled
        var qryString = @"SELECT st
                        FROM SubTask st
                        WHERE st.ParentTask.ParentProject.ParentClient = :clientObj
                        AND st.ParentTaskCategory.VisibleToClient = 1 "
                        + filter + // more ands
                        @" AND st.ParentTaskStatus.ID NOT IN (3, 4, 8)
                        OR st.RaisedByClientID = :clientIDObj
                        ORDER BY st.CreateDateTime";
    
        var query = session.CreateSQLQuery(qryString)
            .SetParameter("clientObj", client)
            .SetParameter("clientIDObj", client.ID);
    
        // return query or whatever you need to do
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多