hibernate - 如何在hql中对链接列表进行排序?

标签 hibernate grails sorting hql linked-list

this相同的问题,只有我想在Hibernate中使用(如果重要,请使用grails)。

所以域类看起来像这样

class LinkedElement {
  LinkedElement precedingElement
  String someData
}

并且我想按它们的链接顺序查询所有元素(第一个LinkedElement的null作为previousElement)。这可能有效吗?

最佳答案

您只能轻松找出谁在该行的开头(即,前一个元素为null)。不幸的是,这意味着您在N + 1查询区域中以获取整个列表。

Query 1 - who's in front 
Query 2 - who's behind 1
Query 3 - who's behind 2
....
Query n - who's behind n-1
Query n+1 - who's behind n -> no one is behind n, I must be at the end

在提到您提到的问题时,不要因为语法简洁而将效率错误。仅仅因为某些DBMS会为您提供方便的语法,它们仍然可以通过以下方法解决相同的问题:a。执行相同的低效算法,但语法简化,或b。)提前编制索引,因此DBMS可以高效地访问您的数据,即使您没有那样建模。因此,如果您绝对必须使用hibernate使用指定的数据结构解决此问题,那么您应该考虑使用Native SQL Query,在数据库级别进行调整,并利用DBMS在该 Realm 为您提供的功能。

如果您考虑使用的数据结构,那么代表堆栈非常有用。您可以只执行几个操作即可进行推,弹出和顶部操作。通常,这就是单向链表的优点。对于诸如队列之类的事情,您可能要考虑使用双向链表,因为您可以通过仅执行几个操作就可以使队列出队,入队和入队。对于将元素动态添加到列表中,LinkedLists很棒。为了按顺序获取整个事情列表,LinkedLists本身效率很低-您正在查看n + 1或n个操作,具体取决于单向或双向操作。取而代之的是使用ArrayList。想知道第三个元素是什么?很酷,使用它的索引。与需要使用first.getNext.getNext的链表相比,这是更有效的方法!但是,如果您需要向列表中添加内容或将其用于排队或堆栈类型的应用程序,那么它肯定有其缺点-与在链接列表中添加新链接相比,调整数组的大小非常昂贵。

我希望我能为您提供更好的答案,但希望这至少有所帮助。

关于hibernate - 如何在hql中对链接列表进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3341510/

相关文章:

java - 如何在 Java 中对对象数组(点)进行排序?

java - Hibernate 注释放置问题

java - Spring Boot 和 Hibernate 多次调用同一个方法

grails - 多个Grails项目命名相同的构建问题

grails - 缺少所需的源文件夹 : '.link_to_grails_plugins/tomcat-1.3.6/src/groovy'

python - python中的多维排序

php - 在 PHP 中按字母顺序递归排序多维数组的键和值

hibernate - 如何使用 JPA EntityManager 注册自定义 Hibernate IdentifierGenerator?

java - 使用 Hibernate-Java 执行查询

grails - Grails 2.3.5集成测试