erupts/erupt

实体类没有实体表的情况下如何处理

Closed this issue · 7 comments

版本情况

JDK版本: openjdk_8_201
erupt版本:1.12.12

问题描述(包括截图)

场景:

通过@EruptDataSource 多数据源 查询另外一个数据库的一些数据,查询的结果是一个多表关联的结果,并不是一个实体表。

问题:

如何实现实体类不是实体表,而是一段SQL的查询的场景呢。 DataProxy 有查询前和查询后的方法,是否可以提供一个查询的方法,来实现自定义的SQL查询。 这样 就可以引用 mybatis 实现更加复杂的查询SQL

如果需要自定义的复杂查询可以使用EruptDao的getJdbcTemplate()方法。直接通过JdbcTemplate写原生sql。

代码示例:
Integer realCounter = eruptDao.getJdbcTemplate().queryForObject(String.format("select count(*) from e_upms_menu where parent_menu_id = %d and value like '%s@%%'", eruptMenu.getId(), eruptMenu.getValue()), Integer.class);

可以使用@EruptDataProcessor 自定义数据源 来实现这个效果吗

可以使用@EruptDataProcessor 自定义数据源 来实现这个效果吗

目前看是不可以,@EruptDataProcessor的运行基础是IEruptDataService接口的实现,IEruptDataService是基于EruptModel来进行数据操作的,也就是基于一张实体表实现增删改查。要实现你的需求,要在IEruptDataService里新增一个使用原生sql进行查询的方法,在实现类里使用EntityManager的createNativeQuery()方法来实现这个接口。

这样看,感觉Erupt的多数据源方案和EruptModel是强绑定的,确实不方便处理多数据源下的复杂查询。

如果你只是需要多数据源的功能,不涉及其他框架功能的话,应该可以直接继承EruptDataServiceDbImpl,增加一个原生sql的查询方法。在使用的时候强转成实现类,就可以用你自己写的方法来进行查询了。
IEruptDataService iEruptDataService = DataProcessorManager.getEruptDataProcessor(eruptModel.getClazz()); // 在这一步获取service的时候直接强转

好的 感谢大佬,我尝试一下 看看能不能实现

使用以下逻辑实现:

  1. 引入dynamic-datasource
  2. 实现 IEruptDataService 接口 重写queryList 等方法 参考官方文档的 [自定义数据源 @EruptDataProcessor]