比如: A 方法查询 List<User> B 方法查询 List<UserAddress> C 方法聚合返回 List<UserInfo> 两者之间通过 user_id 关联,一般大家都是怎么去做聚合。 有没有相对大型且规范的业务项目可以学习一下
1
jones2000 2023-04-19 16:19:16 +08:00
存库, 做一个视图就完事了。
|
2
pigeonx 2023-04-19 16:19:42 +08:00
写到数据库->聚合->拿出来 /doge
|
3
810975 2023-04-19 16:20:20 +08:00
直接都转换成 Map userId 做 key 。。然后遍历请求的 list 做数据整合 。。很原始 但是挺好用啊
|
4
MonkeyJon 2023-04-19 16:21:14 +08:00
其他俩转 map,userId 为 key
|
5
baobao1270 2023-04-19 16:21:27 +08:00
C# 有 AutoMapper ,不知道 Java 有没有类似的东西
|
6
28Sv0ngQfIE7Yloe 2023-04-19 16:30:10 +08:00
Stream + Collectors.groupingBy
感觉这种问题问问 chatGPT 就行了 |
7
RainCats 2023-04-19 16:33:26 +08:00
A 或者 B 用 stream 转成 map 就好啦,key 是 userId ,这样聚合成 C 的样子时也方便取值
|
8
idealhs 2023-04-19 16:35:19 +08:00
C#用 LinQ 😀
|
9
SilenceLL OP |
10
Nexone 2023-04-19 16:35:43 +08:00
c#用 linq 啊 a join b 然后 select
|
11
superedlimited 2023-04-19 16:35:50 +08:00 via iPhone
rxjava 用 observable.zip
|
12
idealhs 2023-04-19 16:37:17 +08:00
@baobao1270 如果你把 AutoMapper 用作 Entity 与 DTO 转换以外的用途,也许应该思考下是否用错了。
|
14
xuanbg 2023-04-19 16:55:56 +08:00
为什么不在数据库里面联表查询,一次拿出来?
|
15
dongya 2023-04-19 16:57:48 +08:00
chatgpt 回答
针对这个问题,通常有以下几种解决方案: 在 C 方法中嵌套调用 A 、B 方法,通过 user_id 进行聚合返回 List<UserInfo>。但这种方法存在一个问题,如果数据量较大,调用多次 A 、B 方法,会造成性能问题。 在程序启动时,将 A 方法和 B 方法查询的数据缓存到本地内存或者 Redis 等缓存中,C 方法中直接从缓存中获取并进行聚合返回 List<UserInfo>。这种方法可以提高查询性能,但存在缓存一致性的问题,需要考虑缓存失效策略。 通过 SQL 语句进行关联查询,一次性返回 List<UserInfo>。这种方法可以减少程序调用次数,提高查询性能。但是需要注意的是,对于大数据量的情况,这种方式也可能会导致性能问题,需要根据具体情况进行调优。 针对相对大型且规范的业务项目,可以参考一些开源项目,如: Apache Shiro:安全框架,提供了完善的身份认证、授权、加密等功能。 Spring Framework:应用程序开发框架,提供了 IOC 、AOP 、事务管理等功能。 MyBatis:持久层框架,提供了 ORM 映射、SQL 生成等功能。 以上开源项目中,都涉及到多个业务模块之间的数据关联和聚合查询。可以根据自己的需求选择适合自己的开源项目进行学习。 |
19
wliansheng 2023-04-19 17:34:26 +08:00 1
join ,笛卡尔积 (/doge
|
20
optional 2023-04-19 18:09:05 +08:00
CQRS , 查询接口直接 queryDSL 或者其他方式 join 查询。
put/post 按照 entity 更新 |
21
dengji85 2023-04-20 08:56:03 +08:00
我单库也是这样聚合的,很烦去写关联 sql ,所有实体和 dao 都是单表操作
|
22
wowcz 2023-05-02 11:26:03 +08:00
查 3 次表,stream 按 key group ,把两个信息 get set 到 user 里
|