【发布时间】:2013-11-26 02:52:17
【问题描述】:
假设我有两个表:Person 和 Address。两者都有一个数字“id”列,一个人员记录可以有多个地址(外键“Address.person_id”引用“Person.id”)。
我现在想
- 搜索个人及其地址的条件
- 按人员/地址属性对结果排序,并且
- 返回不同的人员ID
- 使用分页(对行范围的附加限制,根据页码和页面大小计算)
获取不明确的个人ID非常简单:
select p.id from person p
left join address a on a.person_id = p.id
where p.firstname is not null
order by a.city, p.lastname, p.firstname
但现在我不能只选择distinct(p.id),因为我有一个订单,除非我也选择订单条件,否则无法应用。
如果我用select distinct(id) from (...) 包装上面的SQL-sn-p,我会得到不同的ids,但会丢失顺序(id 以任意顺序出现,可能是由于散列)
我想出了一个通用但相当不切实际的解决方案,但它不能正常工作(3 个外部选择):
select id from (
select id, rownum as r from (
select distinct(ID), min(rownum) from (
select p.id from person p
left join address a on a.person_id = p.id
where p.firstname is not null
order by a.city, p.lastname, p.firstname
)
group by (id)
order by min(rownum)
)
) where r>${firstrow} and r<=${lastrow}
(占位符 ${firstrow} 和 ${lastrow} 将替换为根据页码和页面大小计算的值)
有没有更好的方法来获取有序的不同 ID 分页?
我正在使用 Hibernate Criteria API 实现这些搜索,我能否以某种方式将外部选择实现为 Hibernate 中的
Projection,或者创建我自己的投影实现来执行此操作?
【问题讨论】:
标签: sql oracle hibernate pagination