Java 如何从服务中有效地调用Spring存储库方法?

Java 如何从服务中有效地调用Spring存储库方法?,java,spring-boot,oop,Java,Spring Boot,Oop,我有一个代码块,如下所示: @Repository public class SummaryDao implements ISummaryDao { public List<Response> reportOfCategory(RequestObject obj){ ... } public List<Response> reportOfGroup(RequestObject obj){ ... }

我有一个代码块,如下所示:

@Repository
public class SummaryDao implements ISummaryDao {

    public List<Response> reportOfCategory(RequestObject obj){
       ...
    }

    public List<Response> reportOfGroup(RequestObject obj){
       ...
    }

    public List<Response> reportOfSubGroup(RequestObject obj){
       ...
    }

}
@Service
public class ReportService {

@Autowired
ISummaryDao summaryDao;

@Autowired
IReportDao reportDao;

public List<Response> call(EnumType type, RequestObject obj){

   if(type == Category) {
     return obj.isSummary ? summaryDao.reportOfCategory : reportDao.reportOfCategory;
   }
   if(type == Group) {
     return obj.isSummary ? summaryDao.reportOfGroup : reportDao.reportOfGroup;
   }
   if(type == SubGroup) {
     return obj.isSummary ? summaryDao.reportOfSubGroup : reportDao.reportOfSubGroup;
   }
...
}
@存储库
公共类SummaryDao实现了issummarydao{
类别的公共列表报告(RequestObject obj){
...
}
组的公共列表报告(RequestObject obj){
...
}
子组的公共列表报告(RequestObject obj){
...
}
}
我的第二个存储库:

@Repository
public class ReportDao implements IReportDao {

    public List<Response> reportOfCategory(RequestObject obj){
       ...
    }

    public List<Response> reportOfGroup(RequestObject obj){
       ...
    }

    public List<Response> reportOfSubGroup(RequestObject obj){
       ...
    }

}
@Repository
public class ReportDao implements IGeneralDao {

    public List<Response> reportOfCategory(RequestObject obj){
       ...
    }

    public List<Response> reportOfGroup(RequestObject obj){
       ...
    }

    public List<Response> reportOfSubGroup(RequestObject obj){
       ...
    }

}
@Repository
public enum ReportDao implements IGeneralDao {
    Category {
        @Override
        public List<Response> callReports(RequestDto requestDto) {
            return ...;
        }
    },
    Group {
        @Override
        public List<Response> callReports(RequestDto requestDto) {
            return ...;
        }
    },
    SubGroup {
        @Override
        public List<Response> callReports(RequestDto requestDto) {
            return ...;
        }
    };

    @Override
    public IGenericDao setEnumType(EnumType type) {
        return valueOf(type.name());
    }
}
@Repository
public enum SummaryDao implements IGeneralDao {
    Category {
        @Override
        public Summary callReports(RequestDto requestDto) {
            return ...;
        }
    },
    Group {
        @Override
        public Summary callReports(RequestDto requestDto) {
            return ...;
        }
    },
    SubGroup {
        @Override
        public Summary callReports(RequestDto requestDto) {
            return ...;
        }
    };

    @Override
    public IGenericDao setEnumType(EnumType type) {
        return valueOf(type.name());
    }
}
@存储库
公共类ReportDao实现了IReportDao{
类别的公共列表报告(RequestObject obj){
...
}
组的公共列表报告(RequestObject obj){
...
}
子组的公共列表报告(RequestObject obj){
...
}
}
然后我从服务类中调用它们,如下所示:

@Repository
public class SummaryDao implements ISummaryDao {

    public List<Response> reportOfCategory(RequestObject obj){
       ...
    }

    public List<Response> reportOfGroup(RequestObject obj){
       ...
    }

    public List<Response> reportOfSubGroup(RequestObject obj){
       ...
    }

}
@Service
public class ReportService {

@Autowired
ISummaryDao summaryDao;

@Autowired
IReportDao reportDao;

public List<Response> call(EnumType type, RequestObject obj){

   if(type == Category) {
     return obj.isSummary ? summaryDao.reportOfCategory : reportDao.reportOfCategory;
   }
   if(type == Group) {
     return obj.isSummary ? summaryDao.reportOfGroup : reportDao.reportOfGroup;
   }
   if(type == SubGroup) {
     return obj.isSummary ? summaryDao.reportOfSubGroup : reportDao.reportOfSubGroup;
   }
...
}
@服务
公共类报告服务{
@自动连线
ISummaryDao summaryDao;
@自动连线
报告道;
公共列表调用(枚举类型,RequestObject obj){
如果(类型==类别){
return obj.isSummary?summaryDao.reportOfCategory:reportDao.reportOfCategory;
}
如果(类型==组){
返回obj.isSummary?summaryDao.reportOfGroup:reportDao.reportOfGroup;
}
if(类型==子组){
返回obj.isSummary?summaryDao.reportOfSubGroup:reportDao.reportOfSubGroup;
}
...
}
我怎样才能有效地调用它们呢?实际上我想避免if-else块和Enum比较

注意:枚举比较可以是开关情况


注意:在这段代码中,我使用了Spring Boot EntityManager。我知道JPARepository。这个问题与它无关。

我解决了它,如下所示:

@Repository
public class SummaryDao implements ISummaryDao {

    public List<Response> reportOfCategory(RequestObject obj){
       ...
    }

    public List<Response> reportOfGroup(RequestObject obj){
       ...
    }

    public List<Response> reportOfSubGroup(RequestObject obj){
       ...
    }

}
@Service
public class ReportService {

@Autowired
ISummaryDao summaryDao;

@Autowired
IReportDao reportDao;

public List<Response> call(EnumType type, RequestObject obj){

   if(type == Category) {
     return obj.isSummary ? summaryDao.reportOfCategory : reportDao.reportOfCategory;
   }
   if(type == Group) {
     return obj.isSummary ? summaryDao.reportOfGroup : reportDao.reportOfGroup;
   }
   if(type == SubGroup) {
     return obj.isSummary ? summaryDao.reportOfSubGroup : reportDao.reportOfSubGroup;
   }
...
}
我创建了一个IGeneralDao来使用公共接口

@Repository
public class SummaryDao implements IGeneralDao {

    public List<Response> reportOfCategory(RequestObject obj){
       ...
    }

    public List<Response> reportOfGroup(RequestObject obj){
       ...
    }

    public List<Response> reportOfSubGroup(RequestObject obj){
       ...
    }

}
然后从主服务呼叫:

@Service
public class ReportService {

@Autowired
IGeneralDao reportDao, summaryDao;

public List<Response> call(EnumType type, RequestObject obj){
   IGeneralDao generalDao = isSummary ? summaryDao : reportDao;
   return generalDao.setEnumType(type).callReports(obj);
}
@服务
公共类报告服务{
@自动连线
IGeneralDao reportDao,summaryDao;
公共列表调用(枚举类型,RequestObject obj){
IGeneralDao generalDao=发布摘要?摘要DAO:报告DAO;
返回generalDao.setEnumType(type).callReports(obj);
}

为什么要使用原始类型,如
列表
?@michalk,我刚刚编辑了它。这只是打字错误。我认为在不了解应用程序背后的数据和业务逻辑的情况下,很难提出建议。有没有可能提供有关数据库(或数据存储)的更多详细信息结构?如果您能够更改底层数据结构,这可能是最好的解决方案。但是,鉴于提供的信息,这一点很难确定。我个人发现,扩展Crudepository在绝大多数用例中都非常有效,但我想您可能出于某种原因不想/不能使用它?