A paginação não funciona com coleções unidas porque conta todas as linhas que satisfizeram o
where
predicado (Hibernate não tem nada a ver com isso, é como os bancos de dados funcionam, por exemplo Oracle rownum
). A maneira usual de superar isso é usar subconsultas, para que
rownum
(ou o equivalente no banco de dados usado) é aplicado às linhas selecionadas de apenas uma tabela (ou tabelas unidas que estão em relacionamentos para um). Em HQL:
select p from Parent p were p in (select c.parent from Child c where ...)
O critério equivalente pode ser construído de forma semelhante.