Java 重用多个存储库标准的最佳方法是什么?
我有一个存储库层,它有许多方法组合,以匹配搜索标准。。重用此标准的最佳方法是什么?我认为像FindByname和BirthdayandAccunamber这样的方法不是一个好主意!谢谢Java 重用多个存储库标准的最佳方法是什么?,java,jpa,repository,criteria,Java,Jpa,Repository,Criteria,我有一个存储库层,它有许多方法组合,以匹配搜索标准。。重用此标准的最佳方法是什么?我认为像FindByname和BirthdayandAccunamber这样的方法不是一个好主意!谢谢 public Order findByIdAndName(String orderId) { List<OrderEntity> list = entityManager.createNamedQuery(OrderEntity.QUERY_FIND_BY_ORDERID_AND_NAME,
public Order findByIdAndName(String orderId) {
List<OrderEntity> list = entityManager.createNamedQuery(OrderEntity.QUERY_FIND_BY_ORDERID_AND_NAME, OrderEntity.class)
.setParameter("orderId", orderId)
.setParameter("name", name).getResultList();
if (list.isEmpty()) {
return null;
}
OrderEntity orderEntity = list.get(0);
return toOrder(orderEntity);
公共订单findByIdAndName(字符串orderId){
List List=entityManager.createNamedQuery(OrderEntity.QUERY\u按\u ORDERID\u和\u名称、OrderEntity.class查找)
.setParameter(“orderId”,orderId)
.setParameter(“name”,name).getResultList();
if(list.isEmpty()){
返回null;
}
OrderEntity OrderEntity=list.get(0);
返回订单(orderEntity);
}听起来您可能在寻找规范模式,该模式允许您编写如下方法:
public Order findOrderBySpecification(Specification specification) {
}
然后使用一个或多个规范的组合(例如,按帐号、帐号和名称等)来调用此功能
这里有一个使用Criteria API的示例:
另请参阅下面的文章,其中提到了Spring数据项目,但即使您没有使用Spring,也可能值得一读
此外,您可以更简单地使用本文中引用的QueryDSL库来实现这一点,而不是使用带有纯JPA(即没有Spring)的冗长的CriteriaAPI
尝试在存储库实现中使用规范模式 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.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();
}
公共列表查询(HibernateSpecification规范){
Session Session=sessionFactory.getCurrentSession();
条件=session.createCriteria(Order.class);
标准(规范toCriteria());
返回条件。list();
}
这些名字没有错。您仍然需要使用na、e、id、生日和帐户参数定义这些查询。如果这让您感到恼火,您可以使用CriteriaBuilder并从参数列表/映射构造查询……除非他没有使用任何特定于Hibernate的代码。如果你根据JPA接口重写,那么可能是正确的答案,尽管基本上是下面建议的。对不起,你在我回答时发送了你的消息。是的,你是对的,他可以在他的情况下实现JPA接口。Alan根据你的声誉判断,你是经验丰富的开发人员,所以我有一个问题。你在现实生活中用过吗?它实际上比显式JPA查询更易于管理吗?您可以通过快速查看这些单行查询来检查它们,而使用规范,您需要打开X类并检查它们的代码(最有可能包含由Ctr+C Ctr+V引起的典型错误)。仅凭您的意见/经验?如果有选择,我将使用QueryDSL。我已经在Hibernte/JPA工作了7或8年,并获得了Oracle JPA证书。即使我们现在忽略了规范,我发现标准API非常糟糕。我更愿意使用CriteriaAPI还是使用:List users=repository.findAll(QUser.user.address.town.eq(“伦敦”)。和(QUser.user.gender.eq(gender.M)))以及X和Y和Z。。。任何组合;我在个人项目中使用它,下一次我在绿地项目上工作时肯定会建议考虑它。对不起,我指的是标准/规范方法与JPQL查询(文本或命名)。但是你已经表达了你对标准的厌恶,所以我想我知道答案。