sql-server - 在 grails 3.3.9 中提供默认的辅助排序列
问题描述
我有一个问题,当使用createCriteria().list(params)
每页 10 条记录来翻阅一组 12 条记录时,第 2 页上显示的 2 条记录出现在第 1 页上。在域映射中指定了默认的“排序”,但指定的列包含重复项,因此我假设排序列中具有重复项的子集的顺序是不确定的。
这也使用可排序的列标题,就像 grails 在您生成全部时一样。这是否意味着任何时候选定的排序列包含重复的顺序可能是不确定的?有没有办法(除了蛮力)传递一个默认的辅助排序列(可能是 ID),除了选择的列来保证顺序吗?
这是在 SQL Server 上,这些是生成的查询:
第 1 页:
select TOP(?)
this_.procedure_occurrence_id as procedur1_22_1_,
this_.provenance_id as provenan2_22_1_,
this_.procedure_date as procedur3_22_1_,
this_.procedure_type_concept_id as procedur4_22_1_,
this_.procedure_source_value as procedur5_22_1_,
this_.associated_provider_id as associat6_22_1_,
this_.relevant_condition_concept_id as relevant7_22_1_,
this_.visit_occurrence_id as visit_oc8_22_1_,
this_.person_id as person_i9_22_1_,
this_.procedure_concept_id as procedu10_22_1_,
person_ali1_.person_id as person_i1_20_0_,
person_ali1_.person_source_value as person_s2_20_0_,
person_ali1_.provenance_id as provenan3_20_0_,
person_ali1_.location_id as location4_20_0_,
person_ali1_.gender_concept_id as gender_c5_20_0_,
person_ali1_.care_site_id as care_sit6_20_0_,
person_ali1_.year_of_birth as year_of_7_20_0_,
person_ali1_.provider_id as provider8_20_0_,
person_ali1_.race_concept_id as race_con9_20_0_,
person_ali1_.month_of_birth as month_o10_20_0_,
person_ali1_.ethnicity_concept_id as ethnici11_20_0_,
person_ali1_.ethnicity_source_value as ethnici12_20_0_,
person_ali1_.race_source_value as race_so13_20_0_,
person_ali1_.gender_source_value as gender_14_20_0_,
person_ali1_.day_of_birth as day_of_15_20_0_
from procedure_occurrence this_
inner join person person_ali1_ on this_.person_id=person_ali1_.person_id
where (person_ali1_.person_id=?)
and this_.provenance_id=?
and this_.procedure_concept_id in (?, ?, ?, ?)
order by this_.procedure_date desc
第2页:
WITH query AS (
SELECT inner_query.*, ROW_NUMBER()
OVER (ORDER BY CURRENT_TIMESTAMP) as __hibernate_row_nr__
FROM (
select TOP(?) this_.procedure_occurrence_id as procedur1_22_1_,
this_.provenance_id as provenan2_22_1_,
this_.procedure_date as procedur3_22_1_,
this_.procedure_type_concept_id as procedur4_22_1_,
this_.procedure_source_value as procedur5_22_1_,
this_.associated_provider_id as associat6_22_1_,
this_.relevant_condition_concept_id as relevant7_22_1_,
this_.visit_occurrence_id as visit_oc8_22_1_,
this_.person_id as person_i9_22_1_,
this_.procedure_concept_id as procedu10_22_1_,
person_ali1_.person_id as person_i1_20_0_,
person_ali1_.person_source_value as person_s2_20_0_,
person_ali1_.provenance_id as provenan3_20_0_,
person_ali1_.location_id as location4_20_0_,
person_ali1_.gender_concept_id as gender_c5_20_0_,
person_ali1_.care_site_id as care_sit6_20_0_,
person_ali1_.year_of_birth as year_of_7_20_0_,
person_ali1_.provider_id as provider8_20_0_,
person_ali1_.race_concept_id as race_con9_20_0_,
person_ali1_.month_of_birth as month_o10_20_0_,
person_ali1_.ethnicity_concept_id as ethnici11_20_0_,
person_ali1_.ethnicity_source_value as ethnici12_20_0_,
person_ali1_.race_source_value as race_so13_20_0_,
person_ali1_.gender_source_value as gender_14_20_0_,
person_ali1_.day_of_birth as day_of_15_20_0_
from procedure_occurrence this_
inner join person person_ali1_ on this_.person_id=person_ali1_.person_id
where (person_ali1_.person_id=?)
and this_.provenance_id=?
and this_.procedure_concept_id in (?, ?, ?, ?)
order by this_.procedure_date desc ) inner_query )
SELECT
procedur1_22_1_,
provenan2_22_1_,
procedur3_22_1_,
procedur4_22_1_,
procedur5_22_1_,
associat6_22_1_,
relevant7_22_1_,
visit_oc8_22_1_,
person_i9_22_1_,
procedu10_22_1_,
person_i1_20_0_,
person_s2_20_0_,
provenan3_20_0_,
location4_20_0_,
gender_c5_20_0_,
care_sit6_20_0_,
year_of_7_20_0_,
provider8_20_0_,
race_con9_20_0_,
month_o10_20_0_,
ethnici11_20_0_,
ethnici12_20_0_,
race_so13_20_0_,
gender_14_20_0_,
day_of_15_20_0_
FROM query
WHERE __hibernate_row_nr__ >= ?
AND __hibernate_row_nr__ < ?
解决方案
I think it's possible to define more than one sort cloumn in domain class:
static mapping = {
sort(["property1" : "asc",
"property2" : "desc"] )
}
推荐阅读
- python - 阅读 HTTP 标头 Python
- google-cloud-platform - 将公共 IP 分配给 GCP 上的嵌套虚拟机,而不使用代理或端口转发
- qt - QML:文本编辑+滚动视图:尝试显示大文本时,无法水平剪辑
- linux - 英特尔 SPDK ioat 示例无法运行
- r - 使用 dplyr 重新组织数据帧
- excel - 在单个宏运行时未检测到嵌入文件
- scala - 使用 scala/spark 从 Intellij 读取 S3 存储桶文件
- php - PHP脚本无法连接到MYSQL数据库
- android - 单击按钮时如何从一个活动切换到另一个活动
- javascript - 在对象数组中查找最大值