2016-11-08 61 views
1

我试图在Grails中映射的域对象上使用.findAll方法。一切正常。但是,当期待MySQL的结果(包含大量行(10.000+))时,需要几秒钟才能完成。有了150.000行,这需要30秒才能完成。Grails在返回大型结果集时发现速度很慢

我的代码:

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

温度有两个嵌套的孩子的。

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

我怀疑的问题是每一行被映射为Temperature(休眠)的对象的事实,也可能嵌套对象。这可能会超过100.000 TemperaturesList

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

+0

简短的回答是,如果你需要它们作为类的实例,那么你做得很对,如果你只是想要“值”,并且实际上不需要对实例进行“动作”,那么使用原始SQL是会更快。 –

+0

@JoshuaMoore我只需要对象的两个字段,所以我实际上并不对对象本身感兴趣。原始SQL是解决这个问题的办法,但这是一个相当长的查询,而且这种查询的可维护性比我试图做的要低。没有编写原始SQL的方法吗? – Sammekl

回答

1

你可能想看看使用criteria and projections。在你的情况下,查询是类似以下内容:

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

你的双向加入使得它更有点棘手,你可能需要使用的,而不是温度TripDevice。