繁体   English   中英

SQLite 查询不在 Java 中运行

[英]SQLite Query Not Running in Java

我使用 DB Browser for SQLite 创建了一个数据库。 现在我正在尝试运行查询以从数据库中检索数据,但我遇到了一个问题。 当我在 DB Browser 中运行查询时,查询运行顺利。 当我尝试在 Java 中运行相同的查询时,我收到一条错误消息。 我对查询字符串进行了三次检查。 我想确保我没有错误地使用SQLite关键字。 为什么在运行此查询 Java 时出现错误?

SELECT
    subject.id, main.name, main.link, subject.name, main_subject.weight
FROM 
    main_subject
LEFT JOIN 
    main ON main_subject.mainId = main.id
LEFT JOIN 
    subject ON main_subject.subjectId = subject.id

查询在数据库浏览器中正确运行。 在此处输入图片说明

MCVE:

主要的

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Type;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * @author sedrick
 */
public class Main
{

    public static void main(String[] args)
    {
        try (DatabaseHandler databaseHandler = new DatabaseHandler()) {
            List<BySubjectItemTwo> bySubjectItemTwos = databaseHandler.getBySubjectItems();
            bySubjectItemTwos.forEach(System.out::println);
            //databaseHandler.getByTitleItems().forEach(System.out::println);
        }
        catch (Exception ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

数据库处理器

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author sedrick
 */
public class DatabaseHandler implements AutoCloseable
{

    String dbString = "jdbc:sqlite:qDatabase.sqlite3";
    private Connection conn;

    public DatabaseHandler()
    {
        try {
            conn = DriverManager.getConnection(dbString);
            System.out.println("Connected to qDatabase!");
        }
        catch (SQLException ex) {
            Logger.getLogger(DatabaseHandler.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Override
    public void close() throws Exception
    {
        conn.close();
    }

    public List<BySubjectItemTwo> getBySubjectItems()
    {
        List<BySubjectItemTwo> returnList = new ArrayList();

        String sqlString = "SELECT subject.id, main.name, main.link, subject.name, main_subject.weight FROM main_subject LEFT JOIN main ON main_subject.mainId = main.id LEFT JOIN subject ON main_subject.subjectId = subject.id";
        try (Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(sqlString)) {
            while (rs.next()) {
                System.out.println(rs.getInt("subject.id") + " - " + rs.getString("main.name") + " - " + rs.getString("main.link") + " - " + rs.getString("subject.name") + " - " + rs.getInt("main_subject.weight"));
                //returnList.add(new BySubjectItemTwo(rs.getInt("subject.id"), rs.getString("main.name"), rs.getString("main.link"), rs.getString("subject.name"), rs.getInt("main_subject.weight")));
            }
        }
        catch (SQLException e) {
            System.out.println(e.getMessage());
        }

        return returnList;
    }  
}

按主题项目二

/**
 *
 * @author sedrick
 */
public class BySubjectItemTwo
{

    private int subjectId;
    private String mainName;
    private String mainLink;
    private String subjectName;
    private int mainSubjectWeight;

    public BySubjectItemTwo(int subjectId, String mainName, String mainLink, String subjectName, int mainSubjectWeight)
    {
        this.subjectId = subjectId;
        this.mainName = mainName;
        this.mainLink = mainLink;
        this.subjectName = subjectName;
        this.mainSubjectWeight = mainSubjectWeight;
    }

    public int getSubjectWeight()
    {
        return mainSubjectWeight;
    }

    public void setSubjectWeight(int mainSubjectWeight)
    {
        this.mainSubjectWeight = mainSubjectWeight;
    }

    public int getSubjectId()
    {
        return subjectId;
    }

    public void setSubjectId(int subjectId)
    {
        this.subjectId = subjectId;
    }

    public String getMainName()
    {
        return mainName;
    }

    public void setMainName(String mainName)
    {
        this.mainName = mainName;
    }

    public String getMainLink()
    {
        return mainLink;
    }

    public void setMainLink(String mainLink)
    {
        this.mainLink = mainLink;
    }

    public String getSubjectName()
    {
        return subjectName;
    }

    public void setSubjectName(String subjectName)
    {
        this.subjectName = subjectName;
    }

    @Override
    public String toString()
    {
        StringBuilder sb = new StringBuilder();
        sb.append("BySubjectItemTwo{subjectId=").append(subjectId);
        sb.append(", mainName=").append(mainName);
        sb.append(", mainLink=").append(mainLink);
        sb.append(", subjectName=").append(subjectName);
        sb.append(", subjectWeight=").append(mainSubjectWeight);
        sb.append('}');
        return sb.toString();
    }
}

错误

----------< sed.work:CreateDatabaseByTitleAndSubjectDatabase >----------
Building CreateDatabaseByTitleAndSubjectDatabase 1.0-SNAPSHOT
--------------------------------[ jar ]---------------------------------

--- exec-maven-plugin:1.5.0:exec (default-cli) @ CreateDatabaseByTitleAndSubjectDatabase ---
Connected to qDatabase!
[SQLITE_ERROR] SQL error or missing database (ambiguous column name: subject.id)
------------------------------------------------------------------------
BUILD SUCCESS
------------------------------------------------------------------------
Total time:  1.484 s
Finished at: 2020-10-16T12:42:35-05:00
------------------------------------------------------------------------

Netbean 的信息

Product Version: Apache NetBeans IDE 12.1
Java: 15; Java HotSpot(TM) 64-Bit Server VM 15+36-1562
Runtime: Java(TM) SE Runtime Environment 15+36-1562
System: Windows 10 version 10.0 running on amd64; Cp1252; en_US (nb)
Maven Project

这个:

FROM main_subject, main, subject

是您查询的问题。

从您的陈述中删除, main, subject
mainsubjectLEFT连接后正确连接。
当您也在FROM子句中使用它们时,这会创建额外的引用和到相同表的CROSS连接。

此外,尽管 SQLite 允许查询返回超过 1 个具有相同名称的列,但最好为列设置别名,以便在结果集中所有列名称都不同。
所以给别名main.namesubject.name ,是这样的:

SELECT subject.id, main.name AS main_name, ..., subject.name AS subject_name, ...

当您检索列值时,不要使用表前缀:

System.out.println(rs.getInt("id") + " - " + rs.getString("main_name") + " - " + rs.getString("link") + " - " + rs.getString("subject_name") + " - " + rs.getInt("weight"));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM