2010-04-22 4 views
0

Я использую этот запрос hql для своих фильтров. Запрос отлично работает за исключением ширины (строки).Задача запроса HQL

Вот запрос,

public IList<ColorGroup> GetDistinctColorGroups(int typeID, int finishID, string width) 
      { 
       string queryStr = "Select distinct c from ColorGroup c inner join c.Products p " + 
            "where p.ShowOnline = 1 "; 


       if (typeID > 0) 
        queryStr += " and p.ProductType.ID = " + typeID; 

       if (finishID > 0) 
        queryStr += " and p.FinishGroup.ID = " + finishID; 

       if (width != "") 
        queryStr += " and p.Size.Width = " + width; 

       IList<ColorGroup> colors = NHibernateSession.CreateQuery(queryStr).List<ColorGroup>(); 

       return colors; 
      } 

ProductType и размер имеют одинаковые отображения и отношения.

Это ошибка;

NHibernate.QueryException: нелегальный синтаксис около коллекции: Размер [Выбрать отчетливые с из .Domain.ColorGroup с внутренним соединением c.Products р где p.ShowOnline = 1 и p.ProductType.ID = 1 и p.FinishGroup.ID = 5 и p.Size.Width = 4]

Любые идеи?

редактировать:

Btw в этом проекте я использовал этот Linq запрос, который действительно simmilar HQL один. Так что я не думаю, что это misstype или более фундаментально ошибка ..

colorOfSerie = (from p in products where p.Size.Width.Equals(width) select p.ColorGroup).Distinct().ToList<ColorGroup>(); 
+0

Если вы удалите условие ширины, выполняется ли запрос i.e, ошибка не возникает? –

+0

Да, он работает с этим. – ygit

ответ

0

Если Width является строкой:

queryStr += " and p.Size.Width = '" + width + "'"; 

Но я хотел бы предложить вам use parameters в запросе вместо конкатенации строк.

+0

Я пробовал, но не работал. Такая же ошибка. – ygit

0

Похоже, что свойство продукта «Размер» не существует. Это «размер» или «ProductSize» или что-то подобное? Если вы удалите это условие, работает ли запрос?

+0

Это размер и есть. Я обновил вопрос. – ygit

0

Я предполагаю, что вам нужно ПРИСОЕДИНИТЬ к элементу размера явно в запросе, так как другие две таблицы (ProductType, FinishGroup) сравниваются с использованием их первичных ключей, я предполагаю, возможно, поэтому это работает? (поскольку они, вероятно, являются отношениями «принадлежит», что означает, что их идентификатор фактически находится в таблице Product).

+0

Благодарим вас за ответ. Я попробовал ваше предложение так, но, к сожалению, ошибка была такой же; = "Выбрать отдельный c из ColorGroup c внутренним соединением c.Products p inner join p.Size s" if (width! = "")queryStr + = "и s.Width =" + width; – ygit

Смежные вопросы