我不是在寻找Hibernate/JPA/JDBC的实现,而是要找一个通用的设计模式。
通过谷歌搜索"pagination"得到了很多信息,很多有趣的文章解释了如何在UI上实现分页以及几乎做同样事情的各种实现方式。
因为我使用的是Spring 3.0.5,我偶然发现了这篇好的参考文章How to implement pagination in Spring MVC 3。
简单的bean:
通过谷歌搜索"pagination"得到了很多信息,很多有趣的文章解释了如何在UI上实现分页以及几乎做同样事情的各种实现方式。
因为我使用的是Spring 3.0.5,我偶然发现了这篇好的参考文章How to implement pagination in 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);
}
但这似乎也不自然,我接着想到了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());
}
这似乎有些脆弱,我一直在想桥接模式可能会有所帮助,但仍然不太合适。
你有什么想法如何处理这个问题吗?
ResultBuilder<T>
通用接口。因此,我们不关心它下面的内容。实现的实际来源是PersonDAO
。在这种情况下,PersonDAO
是ResultBuilder
的一种工厂。 - user381105