当前位置: 首页 > 知识库问答 >
问题:

如何简化两种类似方法的代码?

赵渊
2023-03-14

我想重构这两个方法,除了“maxResult ()”之外,它们实际上是相同的,这两个方法指的是两个不同的 get,一个返回我单个用户,另一个返回列表。我如何简化这两种方法(总是如果有意义的话)这是两种方法:

第一种方法:

public List findFirstByTransactionId(String transactionId) {
        CriteriaBuilder builder = em.getCriteriaBuilder();
        CriteriaQuery<User> criteria = builder.createQuery(User.class);
        Root<User> root = criteria.from(User.class);
        criteria.select(root).where(builder.equal(root.get(User_.transactionId), transactionId));
        criteria.orderBy(builder.asc(root.get(User_.date)));
        TypedQuery<User> query = em.createQuery(criteria).setMaxResults(1);
         return query.getSingleResult();

第二种方法:

public List<User> findAllByTransactionId(String transactionId) {
        CriteriaBuilder builder = em.getCriteriaBuilder();
        CriteriaQuery<User> criteria = builder.createQuery(User.class);
        Root<User> root = criteria.from(User.class);
        criteria.select(root).where(builder.equal(root.get(User_.transactionId), transactionId));
        criteria.orderBy(builder.asc(root.get(User_.date)));
        TypedQuery<User> query = em.createQuery(criteria);
         return query.getResultList();

共有3个答案

薛华奥
2023-03-14

您在查询中调用的方法就像任何其他方法一样工作,因此您可以将一些调用放在 if 块中,如下所示:

public List<User> findByTransactionId(String transactionId, boolean onlyFirst) {
    CriteriaBuilder builder = em.getCriteriaBuilder();
    CriteriaQuery<User> criteria = builder.createQuery(User.class);
    Root<User> root = criteria.from(User.class);
    criteria.select(root).where(builder.equal(root.get(User_.transactionId), transactionId));
    criteria.orderBy(builder.asc(root.get(User_.date)));
    TypedQuery<User> query = em.createQuery(criteria);
    if (onlyFirst) {
      query=query.setMaxResults(1);
    }
    return query.getResultList();
}
顾嘉良
2023-03-14

最简单的选择通常是尝试将相同的代码移到它自己的方法中。在这里,您有多种选择,其中一种可能是这样的:

  1. 编写一个新的(私有)方法:
private List<User> findFirstByTransactionId(String transactionId, boolean onlyOneResult) {
    CriteriaBuilder builder = em.getCriteriaBuilder();
    CriteriaQuery<User> criteria = builder.createQuery(User.class);
    Root<User> root = criteria.from(User.class);

    criteria.select(root).where(builder.equal(root.get(User_.transactionId), transactionId));
    criteria.orderBy(builder.asc(root.get(User_.date)));
    TypedQuery<User> query = em.createQuery(criteria);

    if (onlyOneResult) {
        query = query.setMaxResults(1);
    }
    
    return query.getResultList();
}

然后像这样重构你现有的方法:

public List<User> findFirstByTransactionId(String transactionId) {
    return findFirstByTransactionId(transactionId, false);
}
public List<User> findFirstByTransactionId(String transactionId) {
    return findFirstByTransactionId(transactionId, true);
}

现在,您消除了 8 行重复代码:)

景温书
2023-03-14

更多的是附录。

其他建议添加布尔参数的答案是有效的,但是:干净的编码建议总是尽量减少参数数量。尤其是不鼓励使用此类布尔参数。当然,在这里这样做还是有意义的,以避免代码重复。

但是我会做什么:

    < li >是的,内部有一个< code >个人分发名单

然后,这两个公共方法可以调用内部方法并传递< code > true /< code > false 。使用一个布尔值来做决定是一个实现细节,你应该避免让它在公共方面可见。

 类似资料:
  • 我写了两个方法来查找数组中最小和最大的int,但它们几乎完全相同,所以我觉得应该有一些方法来简化这一点,也许是一种方法? 我不知道如何处理此类问题,所以我很想看到您的回复! 编辑:虽然这个关于如何将算术运算符传递给一个方法的问题和这个关于如何获得Java 8流的最小值和最大值的问题回答了文字编程问题,但我的问题是关于如何处理方法做类似事情的问题,以及一般比较数组的方法。这篇帖子的答案比那些问题的答

  • 我如何简化这一点: 有必要有两个不同的构造函数,只有一点区别吗? 有没有一种方法可以简单地使用其中一种?

  • 本文向大家介绍安装docker-compose的两种最简方法,包括了安装docker-compose的两种最简方法的使用技巧和注意事项,需要的朋友参考一下 这里简单介绍下两种安装docker-compose的方式,第一种方式相对简单,但是由于网络问题,常常安装不上,并且经常会断开,第二种方式略微麻烦,但是安装过程比较稳定 方法一: 查看版本信息 但是此方法会经常因为网络的原因而无法安装 方法二:

  • 我希望直接使用div,progress,它们需要保持响应式,如何简化呢? ...

  • 其中是我自己的班级。 此方法的返回类型是什么?为什么它似乎有两种返回类型?

  • 本文向大家介绍JavaScript数值千分位格式化的两种简单实现方法,包括了JavaScript数值千分位格式化的两种简单实现方法的使用技巧和注意事项,需要的朋友参考一下 在对数值进行格式化的时候,一个常见的问题是按照千分位格式化,网上对这个问题已经有很多种解决方法了,还可以利用Array.prototype.reduce方法来实现千分位格式化。 Array的reduce方法在IE9以下不支持,不