我正在尝试在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代码。我怎么能做到这一点?
答案 0 :(得分:1)
您可能希望了解使用criteria and projections。在您的情况下,查询类似于以下内容:
def temperatures = Temperature.createCriteria().list(max: limit, offset: offset) {
...
projections {
property "x"
property "y"
}
}
你的双向连接使它变得有点棘手,你可能不得不使用TripDevice而不是Temperature。