HQL查询问题

时间:2010-04-22 08:06:31

标签: c# nhibernate 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和Size具有相同的映射和关系。

这是错误;

  

NHibernate.QueryException:非法   语法近集合:大小[选择   来自.Domain.ColorGroup c的不同c   内联系c.Products p where   p.ShowOnline = 1和p.ProductType.ID   = 1且p.FinishGroup.ID = 5且p.Size.Width = 4]

有什么想法吗?

编辑:

在这个项目中,我使用了这个linq查询,这是一个非常简单的hql one。所以我不认为这是一个错误的或更根本的错误..

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

3 个答案:

答案 0 :(得分:0)

如果Width是字符串:

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

但我建议您在查询中使用use parameters而不是字符串连接。

答案 1 :(得分:0)

看起来产品属性“大小”不存在。是“尺寸”还是“ProductSize”或类似的东西?如果删除该条件,查询是否有效?

答案 2 :(得分:0)

我猜你需要在查询中明确地加入Size实体,因为其他两个表(ProductType,FinishGroup)使用它们的主键进行比较我猜它可能就是为什么它有效? (因为,他们可能是“属于”关系,这意味着他们的ID实际上在产品表中。)