I am not looking for a Hibernate/JPA/JDBC implementation, but for a general design pattern.
Googling \"pagination\" gives me loads of information, lot of interestin
If I were you I would return not the result (Set) itself but something that encapsulates retrieval of the result. Some sort of ResultBuilder. Look:
public interface ResultBuilder {
ResultBuilder withOffset(int offset);
ResultBuilder withLimit(int limit);
ResultBuilder orderedBy(String property);
List result();
}
and then change DAO method signature:
ResultBuilder findPersonsByName(String name);
This way you can factor out business-irrelevant arguments from find-family methods. If you don't want to make client specify this params then don't make him.
Just to be clear:
public final class HibernateGenericResultBuilder implements ResultBuilder {
private final Criteria criteria;
public HibernateGenericResultBuilder(Criteria criteria) {
this.criteria = criteria;
}
@Override public ResultBuilder withOffset(int offset) {
criteria.setFirstResult(offset);
return this;
}
@Override public ResultBuilder withLimit(int limit) {
criteria.setMaxResults(limit);
return this;
}
@Override public ResultBuilder orderedBy(String property) {
criteria.addOrder(Order.asc(property));
return this;
}
@Override public List result() {
return new LinkedHashSet(criteria.list());
}
}