我如何配置连接来修复此错误?我使用MySQL和jdbc。
public static void saveCallLink(String oktell_login, String link)
throws SQLException {
Connection conn = DBConnection.getDataSource().getConnection();
DSL.using(conn)
.insertInto(CALLS)
.columns(CALLS.USER_ID, CALLS.CALL_LINK)
.values(
DSL.select(USERS.ID)
.from(USERS)
.where(USERS.OKTELL_LOGIN.equal(oktell_login))
.fetchOne().value1()
, link
).execute();
conn.close();
}
抱歉,已添加日志。
org.jooq.exception.DetachedException:无法执行查询。未配置连接 org.jooq.impl.AbstractQuery.execute(AbstractQuery.java:316) org.jooq.impl.AbstractResultQuery.fetchLazy(AbstractResultQuery.java:365) org.jooq.impl.AbstractResultQuery.fetchLazy(AbstractResultQuery.java:352) org.jooq.impl.AbstractResultQuery.fetchOne(AbstractResultQuery.java:517) org.jooq.impl.SelectImpl.fetchOne(SelectImpl.java:2868) ru.avito.model.CallModel.saveCallLink(CallModel.java:33) ru.avito.web.OktellListener.saveCallRecord(OktellListener.java:31) sun.reflect.NativeMethodAccessorImpl.invoke0(原生方法) sun.reflect.NativeMethodAccessorImpl.invoke(未知来源) sun.reflect.DelegatingMethodAccessorImpl.invoke(未知来源) java.lang.reflect.Method.invoke(未知来源)
答案 0 :(得分:3)
你的错误在这里:
DSL.using(conn)
.insertInto(CALLS)
.columns(CALLS.USER_ID, CALLS.CALL_LINK)
.values(
DSL.select(USERS.ID)
.from(USERS)
.where(USERS.OKTELL_LOGIN.equal(oktell_login))
.fetchOne().value1() // This query cannot be executed
, link
).execute();
您在INSERT
语句中间运行的查询无法执行,因为它没有附加Configuration
(上下文)。作为一般经验法则,请记住:
DSLContext
创建了附加的"到DSLContext.configuration()
,因此可以直接执行DSL
创建"未附加"的查询,因此无法执行,仅嵌入在其他查询中有两种解决方案:
DSL.using(conn)
.insertInto(CALLS)
.columns(CALLS.USER_ID, CALLS.CALL_LINK)
.values(
DSL.using(conn) // Use DSLContext, not DSL here
.select(USERS.ID)
.from(USERS)
.where(USERS.OKTELL_LOGIN.equal(oktell_login))
.fetchOne().value1()
, link
).execute();
但请注意,这将从客户端运行两个单独的查询,这可能不是您真正想要的。你想要:
SELECT
嵌入INSERT
声明DSL.using(conn)
.insertInto(CALLS)
.columns(CALLS.USER_ID, CALLS.CALL_LINK)
.values(
DSL.field(
DSL.select(USERS.ID)
.from(USERS)
.where(USERS.OKTELL_LOGIN.equal(oktell_login))
)
, link
).execute();
现在与以下单个SQL查询相同:
INSERT INTO calls (user_id, call_link)
VALUES ((SELECT id FROM users WHERE oktell_login = :oktell_login), :link)