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在绝大多数用例中都非常有效,但我想您可能出于某种原因不想/不能使用它?