diff --git a/knowledge.md b/knowledge.md index 2c6b716..dc2a534 100644 --- a/knowledge.md +++ b/knowledge.md @@ -694,7 +694,6 @@ meeting_with_room_and_agenda_wo示例: 例如:实体t(id,name),实体t1(id,name,t_id),`select * from t where exists (select * from t1 where t.id=t1.id and t.name like ?)`非法,`select * from t left join t1 on t.id=t1.id and t1.name like ?`合法 - 需求超出读方案能力时,必须使用自定义查询 - **特别注意** 根据主键获取单个或批量DTO/VO且不需过滤列表字段数据的需求,必须使用DTO自动生成的预定义方法,禁止使用读方案 -- 针对Date类型字段的查询,需要参照 **[TOCO 最佳实践]** 中的 **[4.3 Date类型重点关注]**,必须仔细分析需求,看是否需要使用时间范围查询,而非时间点的 == 查询 - **关键配置:** 名称(小写字母+下划线,不以read_plan结尾,全局唯一)、返回结构(DTO/VO,一个读方案只能返回一种类型)、查询条件自然语言描述、是否生成计数方法、排序字段、过滤字段及过滤条件 - **与RPC、代码的关系:** 返回DTO的读方案自动生成RPC方法,参数为QTO,返回值为DTO列表;返回VO的读方案自动生成Java方法,参数为QTO,返回值为VO列表,方法内部逻辑由TOCO完全实现 - **生成的读方案RPC使用:** 读方案RPC属于对应模块,其他模块需先订阅该RPC,用adapter调用;当前模块直接调用对应Service @@ -1695,10 +1694,5 @@ TOCO严格遵照分层规则,必须严格遵守,否则会产生严重后果 处理先读后更新场景时,为避免并发导致数据脏写,应充分利用BoService校验功能。例如:账户扣钱场景,避免并发扣除导致余额不足,传统raw sql用 `update account set balance = balance - amount where user_id = xxx and balance > amount` 的where条件保护;在TOCO中,应该:1、写方案中使用incr字段。2、在boService中添加保护代码 `if(userBo.getBalance() >= 0)` 或通过userBo业务不变性(聚合校验)添加 `balance>=0` 校验。 -#### 4.3 Date类型重点关注 -TOCO中的Date类型对应一个具体时间点,数据格式为 `yyyy-MM-dd HH:mm:ss`,在针对Date类型进行查询时,必须先判断是否应该使用**时间范围查询**,谨慎使用 == 操作符,很可能导致无法查询到数据,以下为几种常见case: -- Entity中有Date类型字段actionTime,如果需要查询当天的操作记录,则读方案中的查询条件应该是针对actionTime的范围查询,查询actionTime在当天0点到当天24点之间的所有数据 -- 如果确定要使用日期作为存储,如 `yyyy-MM-dd`格式,则可以在数据库设计时设计一个String类型的字段,专用于日期 == 的查询 - -----------------------------------------------------------------------------