使用不同的别名多次加入关联

时间:2011-10-05 09:14:20

标签: hibernate grails groovy

我认为,我遇到的问题是Hibernate中的一个错误(已被跟踪 - https://hibernate.onjira.com/browse/HHH-879)。

我的问题是 - 是否有使用grails条件查询多次加入表的解决方法?

SQL将是直截了当的:

SELECT s FROM Store AS s   
    INNER JOIN s.Products AS prod1  
    INNER JOIN s.Products AS prod2  
WHERE 
    prod1.Type = 'Shoes'   
AND 
    prod2.Type = 'Shirts' 

当我在grails标准查询中使用“createAlias”时(一个用于prod1,一个用于prod2),我得到以下错误:

org.hibernate.QueryException:重复的关联路径:studyTags ...

使用OR(一个JOIN和WHERE prod.Type ='Shoes'OR'Birts')进行查询,然后过滤结果集,可能有一种可能性。此解决方案的问题在于,如果我为条件查询指定了限制(最大结果),则实际结果(在过滤之后)可能具有比指定的更少的条目。

任何帮助都将不胜感激。

感谢。

PS:我的真实代码,我遇到这个问题非常复杂。为了解决这个问题,我在商店和产品中使用了这个例子...我认为查询看起来像

Store.withCriteria{
    createAlias('products', 'prod1')
    createAlias('products', 'prod2')

    and{
        eq('prod1.Type', 'Shoes')
        eq('prod2.Type', 'Shirts')
    }
}

2 个答案:

答案 0 :(得分:0)

虽然这是一个古老的问题,但在搜索我的解决方案时,我才知道它。所以我发现hibernate中可能存在一个错误,使得duplikacte别名变得不可能。我使用的工作是使用纯SQL来查找有限的“id”列表,并检查其他查询请求是否与列表匹配。在这个例子中它可能是“

git submodule

然后检查

select x.id from XTable x join products prod1 on... join products prod1 on... where prod1.type= 'shoes' and prod.type = 'shirts';

答案 1 :(得分:-3)

你试过这个吗 - 我想这会归还所有包含“Shoes”和“Shirts”类型产品的商店

Store.withCriteria{
    createAlias('products', 'prod')

    and{
        eq('prod.Type', 'Shoes')
        eq('prod.Type', 'Shirts')
    }
}