Я не ищу реализацию Hibernate / JPA / JDBC, но для общего шаблона проектирования.
Поиск по страницам в Google дает мне массу информации, множество интересных статей, объясняющих, как реализовать разбиение на страницы в пользовательском интерфейсе, и различные реализации, которые более или менее делают то же самое.
Поскольку я используюSpring 3.0.5, и я наткнулся на эту хорошую справочную статью Как реализовать разбиение на страницы в Spring MVC 3 .
Простой бин:
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());
}
Это тоже кажется немного неубедительным, по какой-то причине я продолжаю думать, что паттерн «мост» может быть полезным, но все еще далек от непригодности.
Любая идея, какбудет иметь дело с этим?