返回大型结果集时,Grails findAll变慢

时间:2016-11-08 16:26:11

标签: java mysql hibernate grails groovy

我正在尝试在Grails中的映射域对象上使用.findAll方法。一切正常。但是,当期望MySQL的结果包含大量行(10.000+)时,需要几秒钟才能完成。有150,000行,这需要30秒才能完成。

我的代码:

def temperatures = Temperature.findAll(sort: "logDate", order: "desc", max: limit, offset: offset) {
            sighting.device == device
            if (tripId) {
                tripDevice.trip.id == tripId
            }
        }

温度有两个嵌套的孩子。

def temperature基本上是List类型的Temperature。查询本身可以在0.2秒内在本机SQL中的Grails中执行,从而产生数千行。我还尝试将lazy标签用于我不感兴趣的变量。

我怀疑这个问题是每一行都被映射为Temperature(Hibernate)的对象,也可能是嵌套对象。这可能会超过Temperatures中的100.000 List

我正试图找到一种方法来实现这一点,而根本不编写任何SQL代码。我怎么能做到这一点?

1 个答案:

答案 0 :(得分:1)

您可能希望了解使用criteria and projections。在您的情况下,查询类似于以下内容:

def temperatures = Temperature.createCriteria().list(max: limit, offset: offset) {
    ...
    projections {
        property "x"
        property "y"
    }
}

你的双向连接使它变得有点棘手,你可能不得不使用TripDevice而不是Temperature。