2016-06-14 2 views
0

Так что я пытаюсь сделать оператор Select с помощью HQL.HQL Выбрать с помощью OR

Отборные выглядит следующим образом:

 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"; 
     } 

Проще говоря, он должен сделать это:

выберите (а и б, в) или (г) ORDER BY .....

Однако, когда я выполняю этот код, я получаю ошибку синтаксиса запросов с этим innner исключением:

{ "Индекс находился вне диапазона Должно быть не negat. ive и меньше размера коллекции. \ r \ nПараметр: index "}

Как я могу решить эту проблему?

ответ

0

Я думаю, что проблема связана не с запросом, а с массивом 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 
} 
Смежные вопросы