Я не ищу реализацию Hibernate/JPA/JDBC, но для общей схемы проектирования.
Поисковая разметка "pagination" дает мне массу информации, множество интересных статей, которые объясняют, как реализовать разбиение на страницы на пользовательский интерфейс и различные реализации, которые более или менее делают то же самое.
Так как я использую Spring 3.0.5, и я наткнулся на эту хорошую справочную статью Как реализовать разбиение на страницы в Spring MVC 3.
Простой bean:
public class Person{
private String personName;
private int age;
// ...
}
Простой интерфейс DAO:
public interface PersonDAO{
Set<Person> getAllPersons(int start, int limit,String orderBy);
Set<Person> findPersonsByName(String name, int start, int limit,String orderBy);
}
И реализация hibernate
@Repository
public class PersonDAOImpl implements PersonDAO {
@Autowired(required = true)
private SessionFactory sessionFactory;
public Set<Person> getAllPersons(int start, int limit, String orderBy){
Criteria crit = sessionFactory.getCurrentSession().createCriteria(Person.class);
crit.setFirstResult(start);
crit.setMaxResults(limit);
crit.addOrder(Order.asc("personName"));
return new LinkedHashSet<Person>(crit.list());
}
public Set<Person> findPersonsByName(String name, int start, int limit, String orderBy){
Criteria crit = sessionFactory.getCurrentSession().createCriteria(Person.class);
crit.add(Restrictions.eq("name", name));
crit.setFirstResult(start);
crit.setMaxResults(limit);
crit.addOrder(Order.asc(orderBy));
return new LinkedHashSet<Person>(crit.list());
}
Теперь я думаю, что если мне нужно включить подобные параметры во весь интерфейс, то здесь есть что-то действительно неправильное. Либо я могу обернуть запрос в объект запроса bean и передать этот bean методам, что-то вроде этого
public class PersonRequest{
private int start;
private int limit;
private String orderBy;
private String name;
// ...
}
И впоследствии
public interface PersonDAO{
Set<Person> getAllPersons(PersonRequest request);
Set<Person> findPersonsByName(PersonRequest request);
}
Но это тоже кажется неестественным, почему-то. Тогда я думаю о varargs в Java
public interface PersonDAO{
Set<Person> getAllPersons(Object... params);
Set<Person> findPersonsByName(String name,Object... params);
}
@Repository
public class PersonDAOImpl implements PersonDAO {
@Autowired(required = true)
private SessionFactory sessionFactory;
public Set<Person> getAllPersons(Object... params){
Criteria crit = sessionFactory.getCurrentSession().createCriteria(Person.class);
crit.setFirstResult((Integer)params[0]);
crit.setMaxResults((Integer)params[1]);
crit.addOrder(Order.asc("personName"));
return new LinkedHashSet<Person>(crit.list());
}
public Set<Person> findPersonsByName(String name, Object... params){
Criteria crit = sessionFactory.getCurrentSession().createCriteria(Person.class);
crit.add(Restrictions.eq("name", name));
crit.setFirstResult((Integer)params[0]);
crit.setMaxResults((Integer)params[1]);
crit.addOrder(Order.asc((String)params[2]));
return new LinkedHashSet<Person>(crit.list());
}
Это тоже кажется немного хлипким, по какой-то причине я продолжаю думать, что шаблон моста может быть полезным, но все еще далек от непригодности.
Любая идея, как вы справитесь с этим?