Na verdade, se você PODE fazer isso com o find, você PODE fazer com o paginate. Você pode dar uma olhada aqui
Mas para ser mais específico, você pode adicionar as condições/limite/campos/contain/ordem etc que você usa em find à função paginate.
Eu não usei o grupo no paginate, mas DEVE funcionar :D
No seu caso você terá algo assim:
$this->paginate = array(
'fields' => array(
'Product.category_id',
'COUNT(Product.hotel_id) as total'
),
'group' => array(
'Product.category_id HAVING COUNT(Product.hotel_id) > 1')
)
);
$data = $this->paginate('Product');
Espero que funcione, poste um comentário do seu resultado, se não funcionar você terá que sobrescrever, pois não está aceitando a condição do grupo...
EDITAR:
Você pode tentar fazer algo assim:
Substitua paginate() e paginateCount(), mas com um ajuste, esgueire uma condição para que você possa dizer se é uma paginação com ou não. Algo assim:
function paginate($conditions, $fields, $order, $limit, $page = 1, $recursive = null, $extra = array()){
//if no having conditions set return the parent paginate
if (empty($conditions['having'])
return parent::paginate($conditions, $fields, $order, $limit, $page, $recursive, $extra)
//if having conditions set return your override
//override code here
}
Então você faz algo semelhante em paginateCount(), dessa forma você tem uma paginação seletiva. lembre-se de fazer $conditions['have'] quando não for necessário ou lembre-se de colocá-lo em algum lugar que não afete sua descoberta;)