簡體   English   中英

無法修復JOOQ查詢中的“未知表”異常

[英]Can not fix “Unknown table” exception from JOOQ query

我在從已知存在且知道格式的數據庫中獲取數據時遇到麻煩。

在“ if conn!= null”下面的代碼片段中,這只是一個測試,以驗證數據庫名稱,表名稱等是否正確,並且它們也進行了驗證。

下面的最后一行是生成異常的原因

public static HashMap<Integer, String> getNetworkMapFromRemote(DSLContext dslRemote, Connection conn, Logger logger) {
    HashMap<Integer,String> remoteMap = new HashMap<Integer, String>();
    // conn is only used for test purposes
    if (conn != null) {
        // test to be sure database is ok
        try
        {
            ResultSet rs = conn.createStatement().executeQuery("SELECT networkid, name FROM network");
            while (rs.next()) {
                System.out.println("TEST: nwid " + rs.getString(1) + " name " + rs.getString(2));
            }
            rs.close();
        }
        catch ( SQLException se )
        {
            logger.trace("getNetworksForDevices SqlException: " + se.toString());
        }
    }
    // ----------- JOOQ problem section ------------------------
    Network nR = Network.NETWORK.as("network");
    // THE FOLLOWING LINE GENERATES THE UNKNOWN TABLE 
    Result<Record2<Integer, String>> result      = dslRemote.select( nR.NETWORKID, nR.NAME ).fetch();

這是輸出

TEST: nwid 1 name Network 1

org.jooq.exception.DataAccessException: SQL [select `network`.`NetworkId`, `network`.`Name` from dual]; Unknown table 'network' in field list
    at org.jooq.impl.Utils.translate(Utils.java:1288)
    at org.jooq.impl.DefaultExecuteContext.sqlException(DefaultExecuteContext.java:495)
    at org.jooq.impl.AbstractQuery.execute(AbstractQuery.java:327)
    at org.jooq.impl.AbstractResultQuery.fetch(AbstractResultQuery.java:330)
    at org.jooq.impl.SelectImpl.fetch(SelectImpl.java:2256)
    at com.nvi.kpiserver.remote.KpiCollectorUtil.getNetworkMapFromRemote(KpiCollectorUtil.java:328)
    at com.nvi.kpiserver.remote.KpiCollectorUtilTest.testUpdateKpiNetworksForRemoteIntravue(KpiCollectorUtilTest.java:61)
    .................
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown table 'network' in field list
    .................

為了完整起見,這是JOOQ為Network生成的類文件的一部分

package com.wbcnvi.intravue.generated.tables;
@javax.annotation.Generated(value    = { "http://www.jooq.org", "3.3.1" },
                            comments = "This class is generated by jOOQ")
@java.lang.SuppressWarnings({ "all", "unchecked", "rawtypes" })
public class Network extends org.jooq.impl.TableImpl<com.wbcnvi.intravue.generated.tables.records.NetworkRecord> {
    private static final long serialVersionUID = 1729023198;
    public static final com.wbcnvi.intravue.generated.tables.Network NETWORK = new com.wbcnvi.intravue.generated.tables.Network();
    @Override
    public java.lang.Class<com.wbcnvi.intravue.generated.tables.records.NetworkRecord> getRecordType() {
        return com.wbcnvi.intravue.generated.tables.records.NetworkRecord.class;
    }
    public final org.jooq.TableField<com.wbcnvi.intravue.generated.tables.records.NetworkRecord, java.lang.Integer> NWID = createField("NwId", org.jooq.impl.SQLDataType.INTEGER.nullable(false), this, "");
    public final org.jooq.TableField<com.wbcnvi.intravue.generated.tables.records.NetworkRecord, java.lang.Integer> NETWORKID = createField("NetworkId", org.jooq.impl.SQLDataType.INTEGER.nullable(false).defaulted(true), this, "");
    public final org.jooq.TableField<com.wbcnvi.intravue.generated.tables.records.NetworkRecord, java.lang.String> NAME = createField("Name", org.jooq.impl.SQLDataType.CHAR.length(40).nullable(false).defaulted(true), this, "");
    public final org.jooq.TableField<com.wbcnvi.intravue.generated.tables.records.NetworkRecord, java.lang.Integer> USECOUNT = createField("UseCount", org.jooq.impl.SQLDataType.INTEGER.nullable(false).defaulted(true), this, "");
    public final org.jooq.TableField<com.wbcnvi.intravue.generated.tables.records.NetworkRecord, java.lang.Integer> NETGROUP = createField("NetGroup", org.jooq.impl.SQLDataType.INTEGER.nullable(false).defaulted(true), this, "");
    public final org.jooq.TableField<com.wbcnvi.intravue.generated.tables.records.NetworkRecord, java.lang.String> AGENT = createField("Agent", org.jooq.impl.SQLDataType.CHAR.length(16), this, "");

    public Network() {
        this("network", null);
    }
    public Network(java.lang.String alias) {
        this(alias, com.wbcnvi.intravue.generated.tables.Network.NETWORK);
    }
    ..........

基於“未知表”異常,我認為連接到錯誤的數據庫或錯誤的服務器存在問題,但是控制台輸出對於JDBC查詢是正確的。

任何想法都值得贊賞,也許其他原因可能是根本原因,或者DSLContext無效(但我認為這會產生不同的異常)。

答案最終很簡單,我沒有包含.from()方法

Result<Record2<Integer, String>> result = dslRemote.select( nR.NETWORKID, nR.NAME )
    .from(nR)
    .fetch();

這就是為什么表未知的原因,我從來沒有將from方法放入其中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM