使用GORM / Hibernate进行急切加载查询

时间:2009-09-17 00:19:15

标签: hibernate grails gorm

我的Grails应用程序具有以下域对象

class ProductType {
    String name
    static hasMany = [attributes: Attribute]
}

class Attribute {       
    String name
    static belongsTo = [productType: ProductType]
} 

我的数据库有7个ProductType个,每个都有3个Attribute个。如果我执行查询:

def results = ProductType.withCriteria {
    fetchMode("attributes", org.hibernate.FetchMode.EAGER)
}

我希望返回7个ProductType个实例,但事实上我得到21(7 x 3)。据我所知,如果我要执行与上面相同的SQL查询,结果集将有21行

prod1 | attr1
prod1 | attr2
prod1 | attr3
..... | .....
..... | .....
prod7 | attr1
prod7 | attr2
prod7 | attr3
-------------
Total 21

但我认为当我通过Hibernate / GORM检索这些结果时,我应该得到更多的东西:

prod1 | attr1, attr2, attr3    
..... | ...................
..... | ...................
prod7 | attr1, attr2, attr3
---------------------------
Total 7

顺便说一句,如果我从上面的查询中删除了预先加载,我按预期得到7 ProductType s。我错过了什么?

1 个答案:

答案 0 :(得分:4)

您应该阅读此faq: Hibernate does not return distinct results for a query with outer join fetching enabled for a collection (even if I use the distinct keyword)?

当您指定预先加载时,结果集包含,如您所注意到的,7 * 3行,但实际上您在内存中只有7个productTypes对象(每个对象有2个额外的引用)。
要做你想做的事,你可以添加(注意底层的sql查询没有改变):

SetResultTransformer(new DistinctRootEntityResultTransformer())

def results = ProductType.withCriteria {
    fetchMode("attributes", org.hibernate.FetchMode.EAGER)
    SetResultTransformer(new DistinctRootEntityResultTransformer())
}