关于"Algo如何跨库多表查询"释疑原创
金蝶云社区-hb_guo
hb_guo
2人赞赏了该文章 640次浏览 未经作者许可,禁止转载编辑于2023年12月14日 17:08:46

1.首先,Algo不负责数据库查询,它是进行内存计算,只负责数据处理。通过它可以将以各种方式取得的数据进行处理。


2.如果要进行跨库查询,需要通过ORM来进行,ORM会将跨库查询的结果,通过Algo进行join处理后返回一个结果集。

  譬如:一个非常简单的跨库查询

DataSet dataSet =   ORM.create().queryDataSet("test","gl_voucher","id,billno,creator.name,creator.name",null);


 其中gl_voucher是总账单据标识,"id,billno,name,creator.name,creator.name"是查询列。这其中涉及到两个表,一个是  t_gl_voucher和t_sec_user表,这两个表是跨库的,ORM会先查询t_gl_voucher形成dataSet1,再查询t_sec_user形成dataSet2,然后将dataSet1与dataSet2进行join,得到结果dataSet返回。


当然如果两个没有引用关系的实体不要使用ORM查询,这里是因为gl_voucher引用了bos_user,可以这样查询,如果是两个独立的实体,没有任何引用关系,请分两次ORM查询后,使用Algo进行join处理。类似下面的列子。

 

3.或者自己使用DB查询,自己使用Algo进行join处理。


DataSet dataSet1 = DB.queryDataSet("test",DBRoute.of("fi"),"select fid,fbillno,fcreator from t_gl_voucher");
DataSet dataSet2 = DB.queryDataSet("test",DBRoute.of("sys"),"select fid,fnumber,fname from t_sec_user");


再用Algo进行 join得到最终想要得结果:

DataSet dataSet = dataSet1.join(dataset2,JoinType.LEFT).on("fcreator","fid").select(new String[]{"fid","fbillno"},new String[]{"fnumber","fname"});



4.也可以通过以下方式得到一个跨库查询处理后的DataSet。

DataSet dataSet = Algo.create("test").createDataSet(new ORmInput("test","gl_voucher","id,billno,creator.name,creator.name",null));

这种方式实际上跟直接使用ORM查询是一样的效果,内部也是调用ORM得到的结果集,所以建议直接使用ORM查询。这种方式主要用在当前不想预先将数据查询出来,只是预处理得到一个DataSet,后续在真正迭代使用的时候才会触发查询。



赞 2