尝试在您的存储库实现中使用规范模式。
OrderSpecificationByName.java
public class OrderSpecificationByName implements OrderSpecification, HibernateSpecification {
private String name;
public OrderSpecificationByName(String name) {
super();
this.name = name;
}
@Override
public boolean isSatisfiedBy(Object order) {
return ((Order)order).hasName(name);
}
@Override
public Criterion toCriteria() {
return Restrictions.eq("name", name);
}
}
OrderSpecificationById.java
public class OrderSpecificationById implements OrderSpecification, HibernateSpecification {
private Long id;
public OrderSpecificationById(String id) {
super();
this.id = id;
}
@Override
public boolean isSatisfiedBy(Object order) {
return ((Order)order).hasId(id);
}
@Override
public Criterion toCriteria() {
return Restrictions.eq("id", id);
}
}
那么你必须实现逻辑规范AndSpecification、OrSpecification、NotSpecification等。
AndSpecification.java
public class AndSpecification implements HibernateSpecification {
private Specification first;
private Specification second;
public AndSpecification(Specification first, Specification second) {
first = first;
second = second;
}
@Override
public boolean isSatisfiedBy(Object candidate) {
return first.isSatisfiedBy(candidate) && second.isSatisfiedBy(candidate);
}
@Override
public Criterion toCriteria() {
Conjunction conjuntion = Restrictions.conjunction();
conjuntion.add(first.toCriteria());
conjuntion.add(second.toCriteria());
return conjuntion;
}
}
OrderRepository.java
public List<Order> query(HibernateSpecification specification) {
Session session = sessionFactory.getCurrentSession();
Criteria criteria = session.createCriteria(Order.class);
criteria(specification.toCriteria());
return criteria.list();
}