未配置连接

时间:2016-07-12 13:00:51

标签: java mysql jdbc jooq

我如何配置连接来修复此错误?我使用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(未知来源)

1 个答案:

答案 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创建"未附加"的查询,因此无法执行,仅嵌入在其他查询中

有两种解决方案:

1。附加嵌套选择

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();

但请注意,这将从客户端运行两个单独的查询,这可能不是您真正想要的。你想要:

2。将您的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)