From e29a4f63aae8f13a39e273e520d530f0785f7fbd Mon Sep 17 00:00:00 2001 From: fanxt0218 <3515228784@qq.com> Date: Thu, 19 Jun 2025 12:10:05 +0800 Subject: [PATCH 1/9] Oracle: add OracleChatMemory support Signed-off-by: fanxt0218 <3515228784@qq.com> --- .../jdbc/JdbcChatMemoryRepositoryDialect.java | 3 ++ .../OracleChatMemoryRepositoryDialect.java | 47 +++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/OracleChatMemoryRepositoryDialect.java diff --git a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/JdbcChatMemoryRepositoryDialect.java b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/JdbcChatMemoryRepositoryDialect.java index 526c0908c77..6de842bd01d 100644 --- a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/JdbcChatMemoryRepositoryDialect.java +++ b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/JdbcChatMemoryRepositoryDialect.java @@ -71,6 +71,9 @@ static JdbcChatMemoryRepositoryDialect from(DataSource dataSource) { if (url.contains("hsqldb")) { return new HsqldbChatMemoryRepositoryDialect(); } + if (url.contains("oracle")) { + return new OracleChatMemoryRepositoryDialect(); + } // Add more as needed } catch (Exception ignored) { diff --git a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/OracleChatMemoryRepositoryDialect.java b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/OracleChatMemoryRepositoryDialect.java new file mode 100644 index 00000000000..657d863eb73 --- /dev/null +++ b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/OracleChatMemoryRepositoryDialect.java @@ -0,0 +1,47 @@ +/* + * Copyright 2024-2025 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.ai.chat.memory.repository.jdbc; + +/** + * Dialect for Oracle. + * + * @author Xiaotong Fan + * @since 1.1.0 + */ + +public class OracleChatMemoryRepositoryDialect implements JdbcChatMemoryRepositoryDialect { + @Override + public String getSelectMessagesSql() { + return "SELECT content, type FROM SPRING_AI_CHAT_MEMORY WHERE conversation_id = ? ORDER BY \"timestamp\""; + } + + @Override + public String getInsertMessageSql() { + return "INSERT INTO SPRING_AI_CHAT_MEMORY (conversation_id, content, type, \"timestamp\") VALUES (?, ?, ?, ?)"; + } + + @Override + public String getSelectConversationIdsSql() { + return "SELECT DISTINCT conversation_id FROM SPRING_AI_CHAT_MEMORY"; + } + + @Override + public String getDeleteMessagesSql() { + return "DELETE FROM SPRING_AI_CHAT_MEMORY WHERE conversation_id = ?"; + } + +} From 5b62ffe17658ce9d9dfa42dd72b58b132c348a01 Mon Sep 17 00:00:00 2001 From: fanxt0218 <3515228784@qq.com> Date: Fri, 20 Jun 2025 14:32:25 +0800 Subject: [PATCH 2/9] add Oracle schema and corresponding integration test Signed-off-by: fanxt0218 <3515228784@qq.com> --- .../pom.xml | 16 +++++++++ .../memory/repository/jdbc/schema-oracle.sql | 9 +++++ .../JdbcChatMemoryRepositoryBuilderTests.java | 18 ++++++++++ .../JdbcChatMemoryRepositoryOracleIT.java | 34 +++++++++++++++++++ 4 files changed, 77 insertions(+) create mode 100644 memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/resources/org/springframework/ai/chat/memory/repository/jdbc/schema-oracle.sql create mode 100644 memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/test/java/org/springframework/ai/chat/memory/repository/jdbc/JdbcChatMemoryRepositoryOracleIT.java diff --git a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/pom.xml b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/pom.xml index 75db46a8e1a..8b57633f92e 100644 --- a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/pom.xml +++ b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/pom.xml @@ -88,6 +88,14 @@ true + + + com.oracle.database.jdbc + ojdbc8 + 21.13.0.0 + test + + org.springframework.boot spring-boot-starter-test @@ -100,6 +108,14 @@ test + + + org.testcontainers + oracle-xe + 1.19.0 + test + + org.testcontainers postgresql diff --git a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/resources/org/springframework/ai/chat/memory/repository/jdbc/schema-oracle.sql b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/resources/org/springframework/ai/chat/memory/repository/jdbc/schema-oracle.sql new file mode 100644 index 00000000000..d245ea65b48 --- /dev/null +++ b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/resources/org/springframework/ai/chat/memory/repository/jdbc/schema-oracle.sql @@ -0,0 +1,9 @@ +CREATE TABLE SPRING_AI_CHAT_MEMORY ( + conversation_id VARCHAR2(36) NOT NULL, + content CLOB NOT NULL, + type VARCHAR2(10) NOT NULL CHECK (type IN ('USER', 'ASSISTANT', 'SYSTEM', 'TOOL')), + "timestamp" TIMESTAMP NOT NULL +); + +CREATE INDEX idx_conversation_id ON SPRING_AI_CHAT_MEMORY(conversation_id); +CREATE INDEX idx_conversation_id_timestamp ON SPRING_AI_CHAT_MEMORY(conversation_id, "timestamp"); \ No newline at end of file diff --git a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/test/java/org/springframework/ai/chat/memory/repository/jdbc/JdbcChatMemoryRepositoryBuilderTests.java b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/test/java/org/springframework/ai/chat/memory/repository/jdbc/JdbcChatMemoryRepositoryBuilderTests.java index 87dbfa5f03b..80f6a97f156 100644 --- a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/test/java/org/springframework/ai/chat/memory/repository/jdbc/JdbcChatMemoryRepositoryBuilderTests.java +++ b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/test/java/org/springframework/ai/chat/memory/repository/jdbc/JdbcChatMemoryRepositoryBuilderTests.java @@ -37,6 +37,7 @@ * * @author Mark Pollack * @author Yanming Zhou + * @author Xiaotong Fan */ public class JdbcChatMemoryRepositoryBuilderTests { @@ -136,6 +137,23 @@ void testBuilderWithHsqldbDialectFromDataSource() throws SQLException { assertThat(repository).isNotNull(); } + @Test + void testBuilderWithOracleDialectFromDataSource() throws SQLException { + // Setup mocks for Oracle + DataSource dataSource = mock(DataSource.class); + Connection connection = mock(Connection.class); + DatabaseMetaData metaData = mock(DatabaseMetaData.class); + + when(dataSource.getConnection()).thenReturn(connection); + when(connection.getMetaData()).thenReturn(metaData); + when(metaData.getURL()).thenReturn("jdbc:oracle:thin:@//192.168.19.129:1521/ORCL"); + + // Test with dialect from datasource + JdbcChatMemoryRepository repository = JdbcChatMemoryRepository.builder().dataSource(dataSource).build(); + + assertThat(repository).isNotNull(); + } + @Test void testBuilderWithUnknownDialectFromDataSource() throws SQLException { // Setup mocks for unknown database diff --git a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/test/java/org/springframework/ai/chat/memory/repository/jdbc/JdbcChatMemoryRepositoryOracleIT.java b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/test/java/org/springframework/ai/chat/memory/repository/jdbc/JdbcChatMemoryRepositoryOracleIT.java new file mode 100644 index 00000000000..a2db77b3eda --- /dev/null +++ b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/test/java/org/springframework/ai/chat/memory/repository/jdbc/JdbcChatMemoryRepositoryOracleIT.java @@ -0,0 +1,34 @@ +/* + * Copyright 2023-2025 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.ai.chat.memory.repository.jdbc; + +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.jdbc.Sql; + +/** + * Integration tests for {@link JdbcChatMemoryRepository} with Oracle. + * + * @author Xiaotong Fan + */ + +@SpringBootTest +@TestPropertySource(properties = {"spring.datasource.url=jdbc:tc:oracle:21.3.0.0:///"}) +@Sql(scripts = "classpath:org/springframework/ai/chat/memory/repository/jdbc/schema-oracle.sql") +public class JdbcChatMemoryRepositoryOracleIT extends AbstractJdbcChatMemoryRepositoryIT{ + +} From b1026d994929608ea55df6acdf0960c016882327 Mon Sep 17 00:00:00 2001 From: fanxt0218 <3515228784@qq.com> Date: Fri, 20 Jun 2025 21:03:46 +0800 Subject: [PATCH 3/9] add the extendedMethod define Signed-off-by: fanxt0218 <3515228784@qq.com> --- .../jdbc/OracleChatMemoryRepositoryDialect.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/OracleChatMemoryRepositoryDialect.java b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/OracleChatMemoryRepositoryDialect.java index 657d863eb73..210a8d03c0a 100644 --- a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/OracleChatMemoryRepositoryDialect.java +++ b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/OracleChatMemoryRepositoryDialect.java @@ -44,4 +44,12 @@ public String getDeleteMessagesSql() { return "DELETE FROM SPRING_AI_CHAT_MEMORY WHERE conversation_id = ?"; } + /** + * This method requires uncommenting the Override annotation after the interface defines the method + */ + //@Override + public String getDeleteAllMessageSql() { + return "DELETE FROM SPRING_AI_CHAT_MEMORY"; + } + } From beaf0477b8d062648f87ddc2da26ecb20ccebb5c Mon Sep 17 00:00:00 2001 From: fanxt0218 <3515228784@qq.com> Date: Sat, 21 Jun 2025 11:41:17 +0800 Subject: [PATCH 4/9] fix the error: javaformat error(run spring-javaformat:apply) Signed-off-by: fanxt0218 <3515228784@qq.com> --- .../repository/jdbc/OracleChatMemoryRepositoryDialect.java | 6 ++++-- .../repository/jdbc/JdbcChatMemoryRepositoryOracleIT.java | 4 ++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/OracleChatMemoryRepositoryDialect.java b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/OracleChatMemoryRepositoryDialect.java index 210a8d03c0a..71708c21d63 100644 --- a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/OracleChatMemoryRepositoryDialect.java +++ b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/OracleChatMemoryRepositoryDialect.java @@ -24,6 +24,7 @@ */ public class OracleChatMemoryRepositoryDialect implements JdbcChatMemoryRepositoryDialect { + @Override public String getSelectMessagesSql() { return "SELECT content, type FROM SPRING_AI_CHAT_MEMORY WHERE conversation_id = ? ORDER BY \"timestamp\""; @@ -45,9 +46,10 @@ public String getDeleteMessagesSql() { } /** - * This method requires uncommenting the Override annotation after the interface defines the method + * This method requires uncommenting the Override annotation after the interface + * defines the method */ - //@Override + // @Override public String getDeleteAllMessageSql() { return "DELETE FROM SPRING_AI_CHAT_MEMORY"; } diff --git a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/test/java/org/springframework/ai/chat/memory/repository/jdbc/JdbcChatMemoryRepositoryOracleIT.java b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/test/java/org/springframework/ai/chat/memory/repository/jdbc/JdbcChatMemoryRepositoryOracleIT.java index a2db77b3eda..7ed889c7430 100644 --- a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/test/java/org/springframework/ai/chat/memory/repository/jdbc/JdbcChatMemoryRepositoryOracleIT.java +++ b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/test/java/org/springframework/ai/chat/memory/repository/jdbc/JdbcChatMemoryRepositoryOracleIT.java @@ -27,8 +27,8 @@ */ @SpringBootTest -@TestPropertySource(properties = {"spring.datasource.url=jdbc:tc:oracle:21.3.0.0:///"}) +@TestPropertySource(properties = { "spring.datasource.url=jdbc:tc:oracle:21.3.0.0:///" }) @Sql(scripts = "classpath:org/springframework/ai/chat/memory/repository/jdbc/schema-oracle.sql") -public class JdbcChatMemoryRepositoryOracleIT extends AbstractJdbcChatMemoryRepositoryIT{ +public class JdbcChatMemoryRepositoryOracleIT extends AbstractJdbcChatMemoryRepositoryIT { } From c92337360e6dd5519d61d296de7d6f1cd752c630 Mon Sep 17 00:00:00 2001 From: fanxt0218 <3515228784@qq.com> Date: Sat, 25 Oct 2025 13:10:16 +0800 Subject: [PATCH 5/9] Adapt JdbcRepos Dialect Signed-off-by: fanxt0218 <3515228784@qq.com> --- .../jdbc/JdbcChatMemoryRepositoryDialect.java | 23 +------------------ 1 file changed, 1 insertion(+), 22 deletions(-) diff --git a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/JdbcChatMemoryRepositoryDialect.java b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/JdbcChatMemoryRepositoryDialect.java index b3a860d5295..3e4cb6737e6 100644 --- a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/JdbcChatMemoryRepositoryDialect.java +++ b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/JdbcChatMemoryRepositoryDialect.java @@ -61,28 +61,6 @@ public interface JdbcChatMemoryRepositoryDialect { * Detects the dialect from the DataSource. */ static JdbcChatMemoryRepositoryDialect from(DataSource dataSource) { - // Simple detection (could be improved) - try (Connection connection = dataSource.getConnection()) { - String url = connection.getMetaData().getURL().toLowerCase(); - if (url.contains("postgresql")) { - return new PostgresChatMemoryRepositoryDialect(); - } - if (url.contains("mysql")) { - return new MysqlChatMemoryRepositoryDialect(); - } - if (url.contains("mariadb")) { - return new MysqlChatMemoryRepositoryDialect(); - } - if (url.contains("sqlserver")) { - return new SqlServerChatMemoryRepositoryDialect(); - } - if (url.contains("hsqldb")) { - return new HsqldbChatMemoryRepositoryDialect(); - } - if (url.contains("oracle")) { - return new OracleChatMemoryRepositoryDialect(); - } - // Add more as needed String productName = null; try { productName = JdbcUtils.extractDatabaseMetaData(dataSource, DatabaseMetaData::getDatabaseProductName); @@ -100,6 +78,7 @@ static JdbcChatMemoryRepositoryDialect from(DataSource dataSource) { case "MySQL", "MariaDB" -> new MysqlChatMemoryRepositoryDialect(); case "Microsoft SQL Server" -> new SqlServerChatMemoryRepositoryDialect(); case "HSQL Database Engine" -> new HsqldbChatMemoryRepositoryDialect(); + case "Oracle" -> new OracleChatMemoryRepositoryDialect(); default -> // Add more as needed new PostgresChatMemoryRepositoryDialect(); }; From 801a5febcd3f671c984ff57bdced75b26b0ed25c Mon Sep 17 00:00:00 2001 From: fanxt0218 <3515228784@qq.com> Date: Sat, 25 Oct 2025 13:11:30 +0800 Subject: [PATCH 6/9] remove empty doc Signed-off-by: fanxt0218 <3515228784@qq.com> --- .../repository/jdbc/JdbcChatMemoryRepositoryDialect.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/JdbcChatMemoryRepositoryDialect.java b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/JdbcChatMemoryRepositoryDialect.java index 3e4cb6737e6..aa9a44da6a9 100644 --- a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/JdbcChatMemoryRepositoryDialect.java +++ b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/JdbcChatMemoryRepositoryDialect.java @@ -53,10 +53,6 @@ public interface JdbcChatMemoryRepositoryDialect { */ String getDeleteMessagesSql(); - /** - * Optionally, dialect can provide more advanced SQL as needed. - */ - /** * Detects the dialect from the DataSource. */ From 529bb2059cf3ba2bec36668d6fa6954f05ad2236 Mon Sep 17 00:00:00 2001 From: fanxt0218 <3515228784@qq.com> Date: Sun, 26 Oct 2025 23:19:58 +0800 Subject: [PATCH 7/9] update chat-memory.adoc(Add the flag for Oracle support) Signed-off-by: fanxt0218 <3515228784@qq.com> --- .../src/main/antora/modules/ROOT/pages/api/chat-memory.adoc | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/chat-memory.adoc b/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/chat-memory.adoc index 4231a2dbcb6..18b28a15969 100644 --- a/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/chat-memory.adoc +++ b/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/chat-memory.adoc @@ -128,6 +128,7 @@ Spring AI supports multiple relational databases via a dialect abstraction. The - MySQL / MariaDB - SQL Server - HSQLDB +- Oracle Database The correct dialect can be auto-detected from the JDBC URL when using `JdbcChatMemoryRepositoryDialect.from(DataSource)`. You can extend support for other databases by implementing the `JdbcChatMemoryRepositoryDialect` interface. From 4a0ebe9af580856c950e705daa18a448b4a8f0a3 Mon Sep 17 00:00:00 2001 From: psilberk Date: Sun, 26 Oct 2025 22:11:55 -0700 Subject: [PATCH 8/9] Adding Oracle Dialect Signed-off-by: psilberk --- .../pom.xml | 14 +++++------ .../OracleChatMemoryRepositoryDialect.java | 6 ++--- .../memory/repository/jdbc/schema-oracle.sql | 24 ++++++++++++++----- .../JdbcChatMemoryRepositoryOracleIT.java | 3 ++- 4 files changed, 30 insertions(+), 17 deletions(-) diff --git a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/pom.xml b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/pom.xml index 31fb946f59b..150ad214a4e 100644 --- a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/pom.xml +++ b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/pom.xml @@ -50,13 +50,7 @@ spring-jdbc - - com.zaxxer - HikariCP - - - org.postgresql postgresql @@ -89,7 +83,13 @@ com.oracle.database.jdbc ojdbc8 - 21.13.0.0 + 23.9.0.25.07 + test + + + + org.springframework.boot + spring-boot-starter-jdbc test diff --git a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/OracleChatMemoryRepositoryDialect.java b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/OracleChatMemoryRepositoryDialect.java index 71708c21d63..32416d5fb23 100644 --- a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/OracleChatMemoryRepositoryDialect.java +++ b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/OracleChatMemoryRepositoryDialect.java @@ -27,12 +27,12 @@ public class OracleChatMemoryRepositoryDialect implements JdbcChatMemoryReposito @Override public String getSelectMessagesSql() { - return "SELECT content, type FROM SPRING_AI_CHAT_MEMORY WHERE conversation_id = ? ORDER BY \"timestamp\""; + return "SELECT content, type FROM SPRING_AI_CHAT_MEMORY WHERE CONVERSATION_ID = ? ORDER BY \"TIMESTAMP\""; } @Override public String getInsertMessageSql() { - return "INSERT INTO SPRING_AI_CHAT_MEMORY (conversation_id, content, type, \"timestamp\") VALUES (?, ?, ?, ?)"; + return "INSERT INTO SPRING_AI_CHAT_MEMORY (CONVERSATION_ID, CONTENT, TYPE, \"TIMESTAMP\") VALUES (?, ?, ?, ?)"; } @Override @@ -42,7 +42,7 @@ public String getSelectConversationIdsSql() { @Override public String getDeleteMessagesSql() { - return "DELETE FROM SPRING_AI_CHAT_MEMORY WHERE conversation_id = ?"; + return "DELETE FROM SPRING_AI_CHAT_MEMORY WHERE CONVERSATION_ID = ?"; } /** diff --git a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/resources/org/springframework/ai/chat/memory/repository/jdbc/schema-oracle.sql b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/resources/org/springframework/ai/chat/memory/repository/jdbc/schema-oracle.sql index d245ea65b48..47a411299b5 100644 --- a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/resources/org/springframework/ai/chat/memory/repository/jdbc/schema-oracle.sql +++ b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/resources/org/springframework/ai/chat/memory/repository/jdbc/schema-oracle.sql @@ -1,9 +1,21 @@ +DROP TABLE SPRING_AI_CHAT_MEMORY; + CREATE TABLE SPRING_AI_CHAT_MEMORY ( - conversation_id VARCHAR2(36) NOT NULL, - content CLOB NOT NULL, - type VARCHAR2(10) NOT NULL CHECK (type IN ('USER', 'ASSISTANT', 'SYSTEM', 'TOOL')), - "timestamp" TIMESTAMP NOT NULL + CONVERSATION_ID VARCHAR2(36 CHAR) NOT NULL, + CONTENT CLOB NOT NULL, + "TYPE" VARCHAR2(10 CHAR) NOT NULL CHECK ( + "TYPE" IN ( + 'USER', + 'ASSISTANT', + 'SYSTEM', + 'TOOL' + ) + ), + "TIMESTAMP" TIMESTAMP NOT NULL ); -CREATE INDEX idx_conversation_id ON SPRING_AI_CHAT_MEMORY(conversation_id); -CREATE INDEX idx_conversation_id_timestamp ON SPRING_AI_CHAT_MEMORY(conversation_id, "timestamp"); \ No newline at end of file +CREATE INDEX SPRING_AI_CHAT_MEMORY_CONVERSATION_ID_TIMESTAMP_IDX + ON SPRING_AI_CHAT_MEMORY( + CONVERSATION_ID, + 'TIMESTAMP' + ); \ No newline at end of file diff --git a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/test/java/org/springframework/ai/chat/memory/repository/jdbc/JdbcChatMemoryRepositoryOracleIT.java b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/test/java/org/springframework/ai/chat/memory/repository/jdbc/JdbcChatMemoryRepositoryOracleIT.java index 7ed889c7430..511967d9ee8 100644 --- a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/test/java/org/springframework/ai/chat/memory/repository/jdbc/JdbcChatMemoryRepositoryOracleIT.java +++ b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/test/java/org/springframework/ai/chat/memory/repository/jdbc/JdbcChatMemoryRepositoryOracleIT.java @@ -27,7 +27,8 @@ */ @SpringBootTest -@TestPropertySource(properties = { "spring.datasource.url=jdbc:tc:oracle:21.3.0.0:///" }) +@TestPropertySource(properties = { "spring.datasource.url=jdbc:oracle:thin:@localhost:1521/FREEPDB1", + "spring.datasource.username=scott", "spring.datasource.password=tiger" }) @Sql(scripts = "classpath:org/springframework/ai/chat/memory/repository/jdbc/schema-oracle.sql") public class JdbcChatMemoryRepositoryOracleIT extends AbstractJdbcChatMemoryRepositoryIT { From 07fd54f636f7e2703a6db797463bee2becef5eb4 Mon Sep 17 00:00:00 2001 From: fanxt0218 <3515228784@qq.com> Date: Tue, 28 Oct 2025 21:53:44 +0800 Subject: [PATCH 9/9] remove deprecated method Signed-off-by: fanxt0218 <3515228784@qq.com> --- .../spring-ai-model-chat-memory-repository-jdbc/pom.xml | 2 +- .../jdbc/OracleChatMemoryRepositoryDialect.java | 9 --------- 2 files changed, 1 insertion(+), 10 deletions(-) diff --git a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/pom.xml b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/pom.xml index f6fefb32b57..38d51b12103 100644 --- a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/pom.xml +++ b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/pom.xml @@ -82,7 +82,7 @@ com.oracle.database.jdbc - ojdbc8 + ojdbc11 23.9.0.25.07 test diff --git a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/OracleChatMemoryRepositoryDialect.java b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/OracleChatMemoryRepositoryDialect.java index 32416d5fb23..a3784509c6e 100644 --- a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/OracleChatMemoryRepositoryDialect.java +++ b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/OracleChatMemoryRepositoryDialect.java @@ -45,13 +45,4 @@ public String getDeleteMessagesSql() { return "DELETE FROM SPRING_AI_CHAT_MEMORY WHERE CONVERSATION_ID = ?"; } - /** - * This method requires uncommenting the Override annotation after the interface - * defines the method - */ - // @Override - public String getDeleteAllMessageSql() { - return "DELETE FROM SPRING_AI_CHAT_MEMORY"; - } - }