Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 重用多个存储库标准的最佳方法是什么?_Java_Jpa_Repository_Criteria - Fatal编程技术网

Java 重用多个存储库标准的最佳方法是什么?

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,

我有一个存储库层,它有许多方法组合,以匹配搜索标准。。重用此标准的最佳方法是什么?我认为像FindByname和BirthdayandAccunamber这样的方法不是一个好主意!谢谢

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查询(文本或命名)。但是你已经表达了你对标准的厌恶,所以我想我知道答案。