Невозможно правильно сформировать SQL-запрос из Java - PullRequest
0 голосов
/ 12 февраля 2012

Я пытаюсь запросить данные из моего приложения через базу данных postgresql. Чего я хочу добиться - это от "Users", где "Username" = 'stackoverflow'

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

Таким образом, пытаюсь отправить запрос в том же формате, что и

String SQL_QUERY = "from " + "\"Users\"" + " where " + "Username" + "=" + "'" + request.getParameter("username") + "'";

Когда я запускаю это, я получаю следующую ошибку: неожиданный символ: '"' [из" Users ", где Username = user1]

Если я удалю двойные кавычки, это не будет работать, говоря, что таблица с именем users не существует. Какой выход из этого тупика? Куда я иду не так ??

Спасибо.

Ответы [ 3 ]

1 голос
/ 12 февраля 2012

Это должно быть то, что вы хотите:

String username = request.getParameter("username");
String SQL_QUERY = "SELECT * FROM \"Users\" WHERE \"Username\" ='" + username + "'";

Вы можете проверить это по

System.out.println(SQL_QUERY);

который печатает

SELECT * FROM "Users" WHERE "Username" ='foo'

ВНИМАНИЕ / ОПАСНОСТЬ : Этот оператор решит вашу проблему с именами таблиц и столбцов в смешанном регистре PostgreSQL. НО предоставление значения для Username для запроса таким образом делает вас уязвимым даже для самой простой атаки SQL-Injection . Пожалуйста, используйте PreparedStatement вместо этого и напишите

String SQL_QUERY = "SELECT * FROM \"Users\" WHERE \"Username\" = ?";
0 голосов
/ 12 февраля 2012

Следование синтаксису Postgresql, в конце концов, помогло получить решение.Изменил имена всех столбцов на маленькие прописные, а затем попытался, что решило большинство проблем.Благодаря AH

        String SQL_QUERY = "FROM Users WHERE username ='" + username + "'";
        Query query = objSession.createQuery(SQL_QUERY);

        List list = query.list();
        for (Iterator it = list.iterator(); it.hasNext();) {
            Users objUsers = (Users) it.next();
            System.out.println("Username: " + objUsers.userName);
            System.out.println("Password: " + objUsers.password);
            System.out.println("Name: " + objUsers.name);
        }
0 голосов
/ 12 февраля 2012

Где находится предложение SELECT запроса?Это должно быть примерно так:

String SQL_QUERY= "SELECT * FROM Users WHERE Username='" + request.getParameter("username") + "'";

Или вот так:

String SQL_QUERY= "SELECT FirstName, LastName, Email FROM Users WHERE Username='" + request.getParameter("username") + "'";

Вот очень похожий пример, который использует PreparedStatementчтобы избежать атаки безопасности внедрения SQL: https://www.owasp.org/index.php/Preventing_SQL_Injection_in_Java

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