Java 使用联接对排序数据进行休眠分页
我们目前正在研究加速应用程序的方法,其中很大一部分与实体列表(实际上是一个表)有关 参数和要求 该列表的参数和要求如下(我将尝试在此处仅提及相关参数和要求):Java 使用联接对排序数据进行休眠分页,java,hibernate,pagination,Java,Hibernate,Pagination,我们目前正在研究加速应用程序的方法,其中很大一部分与实体列表(实际上是一个表)有关 参数和要求 该列表的参数和要求如下(我将尝试在此处仅提及相关参数和要求): 列表中最多可以有500000行/实体 一次只显示其中的几个,我们将在这里使用分页 用户可以选择在列表中显示哪些列(因此我们不能提供单一的“静态”查询) 大多数列表列都是可排序和/或可筛选的 这些实体有一对多的关系,这些关系还提供了一些列表列 某些列表列可以包含多个值(这些值在单个单元格中显示为列表) 来自当前用户操作(如编辑、上传等)的
- 列表中最多可以有500000行/实体
- 一次只显示其中的几个,我们将在这里使用分页
- 用户可以选择在列表中显示哪些列(因此我们不能提供单一的“静态”查询)
- 大多数列表列都是可排序和/或可筛选的
- 这些实体有一对多的关系,这些关系还提供了一些列表列
- 某些列表列可以包含多个值(这些值在单个单元格中显示为列表)
- 来自当前用户操作(如编辑、上传等)的任何数据更新应尽快反映在列表中(即“立即”)
- 如何最好地对具有动态列和每个单元格可能有多个值的大量行进行分页
- Hibernate5.x是否支持“从选择中选择”之类的功能
- 当必须对多个关系进行排序和筛选时(即单个联接可能导致重复行),如何使用Hibernate进行分页
我们处理的是1000万行,绝对没有性能问题。执行排序和分页的查询平均耗时不到100毫秒。您可以使用HQL运行SQL查询,方法是将查询作为String@GauravSrivastav是的,我们知道如何执行SQL查询,如果没有更好的方法,我们将使用它。然而,由于查询可能变得非常复杂,并且是动态创建的,因此我们不希望必须访问实体的映射信息来提取构建此类查询所需的信息——如果Hibernate已经提供了我们可以使用的东西,则不必如此。您的模型有多复杂?通过使用数据库视图并将实体与之绑定,您可能会获得最佳性能。糟糕的是,您需要手工编写数据库视图(如果您开始支持新的RDBMS,可能还需要另一个版本)。好的是,实体会变得更简单,Hibernate生成性能差的SQL的机会也会减少。@Mick助记符模型非常复杂,有10多个表可以在多个级别上连接(比如实体->类别->文本)以及一些可以在运行时创建/添加的数据列,这些数据列在某种程度上是按照的建模的(有些人认为这是一种反模式,只用于实际需要它的部分)。@Mick助记符视图可能是我们模型的主要部分的一个选项,其结构在运行时是静态的。怎么
class Car {
String manufacturer;
String model;
Date dateOfProduction;
List<TyreSize> allowedTyreSizes;
Set<Date> inspectionDates;
}
+==============+=======+=======+===============+=============+
| Manufacturer | Model | Prod. | Allowed Tyres | Inspections |
+==============+=======+=======+===============+=============+
| BMW | 320d |01/2016| - 225/40 R18 | - 01/07/16 |
| | | | - 225/45 R17 | - 13/12/16 |
+--------------+-------+-------+---------------+-------------+
| Toyota | Camry |09/2016| - 185/70 R13 | - 31/12/16 |
+--------------+-------+-------+---------------+-------------+
SELECT DISTINCT id FROM (
SELECT id, ... FROM car c
LEFT OUTER JOIN allowedtyresizes ats ON c.id = ats.car_id
LEFT OUTER JOIN tyresizes ts ON ts.id = ats.tyresize_id
... //additional joins if required
ORDER BY ... //apply any user-defined sorts
WHERE ... //apply any user-defined filters (or maybe put them into the joins)
)
OFFSET ... //page offset
LIMIT ... //page size