Sqlite PreparedStatement не возвращает ResultSet, несмотря на то, что запрос работает в другом месте - PullRequest
0 голосов
/ 28 января 2019

У меня проблема с получением пустого ResultSet запроса, который, как мне известно, работает с данной базой данных.

Эта база данных (усеченная и анонимная) выглядит следующим образом:

-- Table: places
CREATE TABLE places (id INTEGER PRIMARY KEY AUTOINCREMENT, venue_id INTEGER, timestamp INTEGER, venue_name TEXT);
INSERT INTO places (id, venue_id, timestamp, venue_name) VALUES (1, 1, 1533231909000, 'Place 1');
INSERT INTO places (id, venue_id, timestamp, venue_name) VALUES (2, 2, 1533231909000, 'Place 2');
INSERT INTO places (id, venue_id, timestamp, venue_name) VALUES (3, 1, 1533231911000, 'Place 1');
INSERT INTO places (id, venue_id, timestamp, venue_name) VALUES (4, 1, 1533232901300, 'Place 1');
INSERT INTO places (id, venue_id, timestamp, venue_name) VALUES (5, 2, 1533233301300, 'Place 2');
INSERT INTO places (id, venue_id, timestamp, venue_name) VALUES (6, 3, 1533245000000, 'Place 3');
-- Table: opening_times
CREATE TABLE opening_times (id INTEGER PRIMARY KEY AUTOINCREMENT, venue_id INTEGER, timestamp INTEGER);
INSERT INTO opening_times (id, venue_id, timestamp) VALUES (1, 1, 1546300836000);
INSERT INTO opening_times (id, venue_id, timestamp) VALUES (2, 2, 1546300840000);
INSERT INTO opening_times (id, venue_id, timestamp) VALUES (3, 1, 1546300840000);
INSERT INTO opening_times (id, venue_id, timestamp) VALUES (4, 1, 1533231911000);
INSERT INTO opening_times (id, venue_id, timestamp) VALUES (5, 1, 1533232011000);
INSERT INTO opening_times (id, venue_id, timestamp) VALUES (6, 3, 1533232011000);
INSERT INTO opening_times (id, venue_id, timestamp) VALUES (7, 2, 1533232011000);

Мой код генерирует следующую команду SQL (хотя и не очень печатную)

SELECT DISTINCT p.venue_name,
                q.changes
FROM   (SELECT COUNT(*) - 1 AS changes,
               venue_id,
               timestamp
        FROM   opening_times t
        GROUP  BY t.venue_id) q
       JOIN places p
         ON q.venue_id = p.venue_id
WHERE  q.changes > 0
       AND q.timestamp >= 0
       AND q.timestamp < 1633232011000
ORDER  BY q.changes DESC,
          p.venue_name ASC; 

Использование этого запроса в программе редактора базы данных SQLite (также выполняется в this SQLFiddle) возвращает правильные результаты, например

| venue_name | changes |
|------------|---------|
|    Place 1 |       3 |
|    Place 2 |       1 |

Однако мой код Java не получает эти же результаты для такой же базы данных.

Class.forName("org.sqlite.JDBC");
Connection connection = DriverManager.getConnection(url);
connection.setAutoCommit(true);

String sql = "..."; // See above
PreparedStatement statement = connection.prepareStatement(sql);
ResultSet resultSet = statement.executeQuery();

while(resultSet.next()) {
   // Code here never executes at present as nothing is returned in the result set
}

У меня естьЯ подготовил множество SO-сообщений и, насколько я могу судить, выполнил правильные шаги, чтобы правильно получить данные.Другие менее сложные запросы работают просто отлично, просто кажется, что этот конкретный не возвращает данные в настоящее время.

Я также использую Java 8 и org.xerial:sqlite-jdbc версии 3.25.2 для подключения к базе данных, если это должно сделатьлюбая разница.

1 Ответ

0 голосов
/ 31 января 2019

Эта проблема была решена путем возврата к org.xerial:sqlite-jdbc:3.21.0.1

Я столкнулся с проблемой на моем компьютере с OSX 10.14, но более поздняя версия 3.25.2, похоже, работает для других пользователей как в Windows, так и в Linux.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...