将应用自管表的 JdbcClient 数据访问迁移为实体、Mapper、构造器查询和必要的显式 SQL。 保留 AgentScope 自管表及原有业务语义,并补充事务、查询与数据库集成测试。
58 lines
2.9 KiB
XML
58 lines
2.9 KiB
XML
<?xml version="1.0" encoding="UTF-8" ?>
|
||
<!DOCTYPE mapper
|
||
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||
<mapper namespace="tech.easyflow.manuagent.mapper.AgentEventMapper">
|
||
|
||
<!-- 显式结果映射避免 payload 列与实体 payloadJson 属性名称不同而丢失事件负载。 -->
|
||
<resultMap id="agentEventResultMap" type="tech.easyflow.manuagent.entity.AgentEventEntity">
|
||
<id property="id" column="id"/>
|
||
<result property="projectId" column="project_id"
|
||
typeHandler="tech.easyflow.manuagent.typehandler.UuidTypeHandler"/>
|
||
<result property="runId" column="run_id"
|
||
typeHandler="tech.easyflow.manuagent.typehandler.UuidTypeHandler"/>
|
||
<result property="eventType" column="event_type"/>
|
||
<result property="eventId" column="event_id"/>
|
||
<result property="payloadJson" column="payload"
|
||
typeHandler="tech.easyflow.manuagent.typehandler.JsonbStringTypeHandler"/>
|
||
<result property="createdAt" column="created_at"/>
|
||
</resultMap>
|
||
|
||
<!--
|
||
PostgreSQL INSERT ... RETURNING 同时完成写入和序号读取,不使用“先插入、再查最大值”
|
||
这种在并发场景下会取错事件的实现。affectData 保留正确的事务与缓存语义。
|
||
-->
|
||
<select id="insertReturning" resultMap="agentEventResultMap" affectData="true" flushCache="true">
|
||
INSERT INTO app.agent_event(project_id, run_id, event_type, event_id, payload)
|
||
VALUES (
|
||
#{event.projectId, typeHandler=tech.easyflow.manuagent.typehandler.UuidTypeHandler},
|
||
#{event.runId, typeHandler=tech.easyflow.manuagent.typehandler.UuidTypeHandler},
|
||
#{event.eventType},
|
||
#{event.eventId},
|
||
#{event.payloadJson, jdbcType=OTHER,
|
||
typeHandler=tech.easyflow.manuagent.typehandler.JsonbStringTypeHandler})
|
||
<!-- 与迁移前 JDBC 返回字段一致;event_id 已完成持久化,但无需再次回传给业务层。 -->
|
||
RETURNING id, project_id, run_id, event_type, payload, created_at
|
||
</select>
|
||
|
||
<!-- PostgreSQL JSONB 运算仅封装在数据库适配层,业务服务不感知方言细节。 -->
|
||
<select id="selectLatestStartedPhase" resultType="string">
|
||
SELECT payload ->> 'phase'
|
||
FROM app.agent_event
|
||
WHERE run_id = #{runId, typeHandler=tech.easyflow.manuagent.typehandler.UuidTypeHandler}
|
||
AND event_type = 'RUN_STARTED'
|
||
ORDER BY id DESC
|
||
LIMIT 1
|
||
</select>
|
||
|
||
<select id="selectLatestMaterialResponseJson" resultType="string">
|
||
SELECT payload::text
|
||
FROM app.agent_event
|
||
WHERE project_id = #{projectId, typeHandler=tech.easyflow.manuagent.typehandler.UuidTypeHandler}
|
||
AND event_type = 'ASK_RESPONDED'
|
||
AND jsonb_typeof(payload -> 'decisions') = 'array'
|
||
ORDER BY id DESC
|
||
LIMIT 1
|
||
</select>
|
||
</mapper>
|