假设我有两个表: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)
,因为我有一个订单,除非我也选择订单条件,否则无法应用。
如果我用 包装上面的 SQL 片段select distinct(id) from (...)
,我会得到不同id
的 s,但会丢失顺序(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实现这些搜索,我能否以某种方式将外部选择实现为
Projection
Hibernate 中的 a ,或者创建我自己的投影实现来执行此操作?