SQLException: нет такого столбца

#java #jdbc #sqlitejdbc

#java #jdbc #sqlitejdbc

Вопрос:

Я новый участник. Я думал, что у меня были проблемы с sqlitejdbc. Я сделал запрос к базе данных sqlite из программы Java.Я получил вышеупомянутое исключение. Мой запрос

 select * 
from (  person as p 
        inner join company as c on p.p_id=c.p_id
     ) 
     inner join contact as ct on p.p_id=ct.p_id 
 where p.p_id=?;
  

Когда я отправил запрос в редактор navicatLite, поместив p.p_id=’1′ вместо p.p_id =? , я был в порядке. Он показал мне правильные значения.

Но из моей Java-программы. Я получил это исключение.

Исключение в потоке "main" java.sql.SQLException: нет такого столбца: p.p_id 
 в org.sqlite.DB.throw x(DB.java: 288)
 в org.sqlite.NativeDB.prepare (собственный метод) 
 в org.sqlite.DB.prepare(DB.java:114)
 в org.sqlite.PrepStmt.(PrepStmt.java:37) 
 в org.sqlite.Conn.prepareStatement(Conn.java: 231)
 в org.sqlite.Conn.prepareStatement(Conn.java: 224)
 в org.sqlite.Conn.prepareStatement(Conn.java: 213)
 в programTest.test.main(test.java:19)
Результат Java: 1

Я уверен, что существует таблица person и поле p_id. Я искал такого рода вопросы на этом сайте, но я нашел тот, который связан с ruby on rails, а не с Java. Я понятия не имею, что не так.

Моя Java-программа

 import java.sql.*;

/**
 *
 * @author Htet 101
 */
public class test {

    public static void main(String[] args) throws Exception {
        Class.forName("org.sqlite.JDBC");
        Connection conn =
                DriverManager.getConnection("jdbc:sqlite://C://Users//Htet 101//Documents//addressbook.s3db");
        PreparedStatement stat = conn.prepareStatement("select * from (person as p inner join company as c on p.p_id=c.p_id) inner join contact as ct on p.p_id=ct.p_id where p.p_id=?;");
        stat.setInt(1, 1);

        ResultSet rs = stat.executeQuery();
        while (rs.next()) {
            System.out.print("Name : "   rs.getString("p_name")   " ");
        }
        rs.close();
        conn.close();
    }
}
  

Я разрабатываю его с использованием NetBeans 6.9.1, SQLite 3.7.8, SQLiteJDBC v056.

Ответ №1:

Я не совсем уверен, но я думаю, что это должно сработать, если вы удалите скобки из From : select * from
person as p
inner join company as c on p.p_id=c.p_id
inner join contact as ct on p.p_id=ct.p_id where p.p_id=?;

Комментарии:

1. Отлично! Теперь это правильно. Спасибо за вашу помощь. Хорошо, но почему я не могу добавить скобки? Заранее спасибо.

2. Я не работал с sqllite, поэтому не могу сказать вам наверняка. Я был действительно удивлен, что это сработало из какого-то клиентского приложения; в моем понимании фигурные скобки скрывают псевдонимы внутри (поэтому p и c становятся невидимыми во внешнем контексте)

3. @ht3t здесь принято отмечать ответ, который помог решить вашу проблему

Ответ №2:

Скобки, вероятно, интерпретируются так, как если бы вы запускали то, что называется встроенным представлением в Oracle — в основном динамически созданное представление. Поэтому я не думаю, что это ошибка в драйвере.

Ответ №3:

Если точно такой же запрос выполняется нормально с navicat и неправильно с java, это означает, что драйвер неисправен. Но убедитесь, что это точно то же самое.

Кроме того, эти скобки подозрительны — избавьтесь от них.

Комментарии:

1. Спасибо за вашу помощь. Я удалил скобки, и это было решено.