使用子选择和窗口功能执行复杂查询时出现SQLite Java错误

我有一个(复杂的)查询,该查询使用子选择和窗口函数(SQLite确实支持:https://www.sqlitetutorial.net/sqlite-window-functions/)。在数据库工具(在本例中为dbeaver)中运行此查询时,此查询正确执行,在Java中运行时,出现SQLite错误: [SQLITE_ERROR] SQL error or missing database (near "(": syntax error)

两者都使用相同的jar:sqlite-jdbc-3.27.2.1.jar。我尝试修剪Java中的sql字符串,删除所有不需要的空格。这没有帮助。

查询:

SELECT *,(SELECT story.name FROM story WHERE story.id = story_id) AS story_name,round((STRFTIME('%s',last_reg) - STRFTIME('%s',first_reg)) / (60.0),2) AS minutes,first_reg)) / (60.0 * 60.0),2) AS hours
  FROM (
    SELECT *,ROW_NUMber() OVER (
             PARTITION BY story_id,reg_date
             ORDER BY reg_time DESC
           ) reg_number,FIRST_VALUE(reg_time) OVER (
             PARTITION BY story_id,reg_date
             ORDER BY reg_time
           ) first_reg,LAST_VALUE(reg_time) OVER (
             PARTITION BY story_id,reg_date
             ORDER BY reg_time 
           ) last_reg
      FROM work_registration
     ORDER BY reg_date,reg_time
  );

DDL的完整性:

CREATE TABLE IF NOT EXISTS story
(   id          integer PRIMARY KEY
    name        text    NOT NULL
);

CREATE TABLE IF NOT EXISTS work_registration
(   reg_date    text    NOT NULL,reg_time    text    NOT NULL,description text,story_id    integer NOT NULL,FOREIGN KEY (story_id) REFERENCES story (id)
);

CREATE UNIQUE INDEX IF NOT EXISTS idx_work_registration_date_time_story
ON work_registration (reg_date,reg_time,story_id);

Java的重要部分:

public class HoursDatabaseService {

    private static final String URL = "jdbc:sqlite:mf-plugin-hours.db";

    private Connection connect() {
        Connection conn = null;
        try {
            conn = DriverManager.getconnection(URL);
        } catch (SQLException e) {
            LOG.error(e.getMessage());
        }
        return conn;
    }

    public void selectAll() {
        String sql = " ... "; // <- here goes the query

        try (Connection conn = this.connect();
             Statement stmt = conn.createStatement();
             ResultSet rs = stmt.executeQuery(sql)) {

            // loop through the result set
            while (rs.next()) {
                 // stuff
            }
        } catch (SQLException e) {
            LOG.error(e.getMessage());
        }
    }

    public static void main(String[] args) {
        HoursDatabaseService service = new HoursDatabaseService();
        service.selectAll();
    }

}

当数据库工具正确运行此工具时,Java为什么会导致: [SQLITE_ERROR] SQL error or missing database (near "(": syntax error)

我在过程中注意到的晦涩之处:如果使用此查询创建视图,则Java无法启动,因为它发现格式错误的视图:[SQLITE_CORrupT] The database disk image is malformed (malformed database schema (vw_story_registrations) - near "(": syntax error)。有趣的是,在数据库工具中查询视图可以正常工作...

为什么它在Java中不起作用?

gogono 回答:使用子选择和窗口功能执行复杂查询时出现SQLite Java错误

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3122775.html

大家都在问