在 grails 3.3.9 中提供默认的辅助排序列
Provide a default secondary sort column in grails 3.3.9
我遇到一个问题,当使用 createCriteria().list(params)
以 10 records/page 为单位翻阅一组 12 条记录时,第 2 页上显示的 2 条记录出现在第 1 页上。默认 'sort' 在域映射中指定,但指定的列包含重复项,因此我假设排序列中包含重复项的子集的顺序是不确定的。
这也使用可排序列 headers,当您使用 generate-all 时,grails 也是如此。这是否意味着任何时候选定的排序列包含重复项,顺序可能是不确定的?有没有办法(除了蛮力)传递一个默认的辅助排序列(可能是 ID),除了选定的列之外,还要使用它来保证顺序?
这是在 SQL 服务器上,这些是生成的查询:
第 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__ < ?
我认为可以在域中定义多个排序列 class:
static mapping = {
sort(["property1" : "asc",
"property2" : "desc"] )
}
我遇到一个问题,当使用 createCriteria().list(params)
以 10 records/page 为单位翻阅一组 12 条记录时,第 2 页上显示的 2 条记录出现在第 1 页上。默认 'sort' 在域映射中指定,但指定的列包含重复项,因此我假设排序列中包含重复项的子集的顺序是不确定的。
这也使用可排序列 headers,当您使用 generate-all 时,grails 也是如此。这是否意味着任何时候选定的排序列包含重复项,顺序可能是不确定的?有没有办法(除了蛮力)传递一个默认的辅助排序列(可能是 ID),除了选定的列之外,还要使用它来保证顺序?
这是在 SQL 服务器上,这些是生成的查询:
第 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__ < ?
我认为可以在域中定义多个排序列 class:
static mapping = {
sort(["property1" : "asc",
"property2" : "desc"] )
}