gpt4 book ai didi

hibernate - 带有Criteria的Grails,或者一种按预定顺序排序的快速方法

转载 作者:行者123 更新时间:2023-12-02 14:41:36 24 4
gpt4 key购买 nike

数据库函数返回一定范围内所有事件的ID,并按其距离排序。

然后,为了保持性能,我急切地在withCriteria中加载必要的集合,如下所示:

    def events = Event.withCriteria {
'in'('id', ids)
fetchMode("someRelation", FetchMode.JOIN)
// a few more joins
setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY)
}

但是,这弄乱了顺序。我注意到此条件查询的结果返回按ID排序的所有事件。这样做确实有些道理,因为 in不保证任何特殊排序(也没有道理)。但是,这造成了一些问题,因为我希望此列表排序。

所以我要做的是:
    List<Event> temp = [];
ids.each { id -> temp << events.find { it.id == id } }
events = temp;

但是,当列表包含〜2400个元素时,这段代码将使总执行时间增加大约1秒,这是我希望尽可能减少的时间。

还有其他方法可以加快此过程吗?

最佳答案

我认为至少有三种方法可以解决您的问题(我已经进行了其他研究和考虑):

SQL方式

根据this gist的说明,按字段排序也可以在Postgres中使用,不仅在mysql中,而且有点棘手,因为它不直接受支持。在主旨讨论中可以看到,有不同的方法,但是我认为最简洁的方法是最后一种:添加自定义order by子句!

ORDER BY (ID=10, ID=2, ID=56, ID=40) DESC

要在Grails中创建一个返回特定类型对象的自定义SQL查询,可以遵循 this tutorial

时髦的方式(当前)
// only four id, for the sake of simplicity
def ids = [10, 2, 56, 40];

// get your events with your criteria
def events = Event.withCriteria {
'in'('id', ids)
fetchMode("someRelation", FetchMode.JOIN)
// a few more joins
setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY)
}

// create an array that maps event.id -> sortedEventIndex
def indexToIdArray = [];
// event with id 2 is at index 1
// event with id 10 is at index 0
// ...
// [null, null, 1 , null, null, null, null, null, null, null, 0, ...]
ids.eachWithIndex{ num, idx -> indexToIdArray[$num] = $idx }

def sortedEvents = [];
events.each { ev -> sortedEvents[indexToIdArray[ev.id]] = ev }

这样,您已经对O(n)进行了排序,从而消耗了一些额外的内存。
我不知道该解决方案是否真的比您的解决方案更好,但是您应该尝试一下。

另请参阅 this interesting article,以了解如何在常规代码中发现性能问题。

客户方式

将未排序的事件列表与排序数据一起返回给客户端,然后在客户端中对其进行排序。如果您的应用程序的客户端可以通过更多方式对事件列表进行排序,那么我认为该解决方案可能会很有用(每个排序操作仅在客户端进行)。

第四,第五,...

由于这也是一个性能问题,因此还有其他可能的解决方案(取决于您的域/环境):
  • 急切地缓存所有内容,甚至是有序结果
  • 使用固定的点列表进行排序(如果我在p1附近,请使用p1进行排序)
  • 您的想法

  • 我希望这有帮助。

    关于hibernate - 带有Criteria的Grails,或者一种按预定顺序排序的快速方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32278232/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com