2010-04-22 113 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 C 内部联接c.Products p其中 p.ShowOnline = 1和p.ProductType.ID = 1和p.FinishGroup.ID = 5和p.Size.Width = 4]

任何想法?

编辑:

顺便说一下在这个项目中我用这个LINQ查询这实在是simmilar HQL之一。因此,我不认为这是一个misstype或者更根本的错误..

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

如果删除宽度条件,查询是否运行,即不会引发错误? – 2010-04-22 08:46:28

+0

是的,它正在处理它。 – ygit 2010-04-22 08:48:31

回答

0

如果Width是一个字符串:

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

但我建议你use parameters在您的查询,而不是字符串连接。

+0

我试过了,但没有奏效。同样的错误。 – ygit 2010-04-22 08:14:20

0

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

+0

它的大小和存在。我更新了问题。 – ygit 2010-04-22 08:33:06

0

我猜你需要在查询中显式加入Size实体,因为其他两个表(ProductType,FinishGroup)使用它们的主键进行比较我猜测也许这就是它的原因? (因为它们可能是“属于”关系,意味着它们的ID实际上在Product-Table中)。

+0

谢谢你的回答。我尝试了这样的建议,但不幸的是错误是一样的; =“从ColorGroup c内连接c中选择不同的c。产品p内连接p.Size s” if(width!=“”) queryStr + =“and s.Width =”+ width; – ygit 2010-04-22 09:27:50