Подготовленное заявление не ускользает от апострофа - PullRequest
5 голосов
/ 24 августа 2011

Я использую объект соединения JDBC, полученный из hibernate, для выполнения обновления ванны, я делаю это потому, что мне нужно использовать функцию MySql ON DUPLICATE.Но при попытке вставить я не могу вставить, говоря, что строка содержит специальные символы,

Session session = sessionFactory.openSession();
PreparedStatement pstm = null;
Connection conn = session.connection();

try
{
    IRKeyWordTweet record = null;
    conn.setAutoCommit(false);

    for (Iterator itrList = statusToInsert.iterator(); itrList.hasNext();) 
    {   
        try
        {
            record = (IRKeyWordTweet) itrList.next();
            pstm = (PreparedStatement) conn.prepareStatement("INSERT QUERY");

            System.err.println(record.getTwtText());

            //tweetId
            pstm.setLong(1, record.getTweetId());

            Setters For Prepared statement....
            pstm.addBatch();
            int[] updateCounts = pstm.executeBatch();
        }
        catch (Exception e) 
        {
            e.printStackTrace();
        }
    }
}
catch (Exception e) 
{
    log.error("Exception Occured",e);
}
finally
{   
    try 
    {
        pstm.close();
        conn.close();
    }
    catch (SQLException e) {
        e.printStackTrace();
    }
    session.close();
}

Что может быть причиной этого?

1 Ответ

9 голосов
/ 24 августа 2011

Для экранирования одинарных кавычек вы можете использовать escape-последовательность JDBC.

Statement statement = 
statement.executeQuery(
  "SELECT * FROM DATA_TABLE  WHERE COLUMN1 LIKE 'Having\'s Quotes%' {escape '\'}");

{ escape '\'} информирует драйвер JDBC о преобразовании символа '\' в escape-символ, специфичный для базы данных.

Полезная ссылка здесь

Кроме того, если вы используете PreparedStatement, вам не нужно бежать!

PreparedStatment ps = conn.prepareStatement("SELECT * FROM DATA_TABLE WHERE COLUMN1 LIKE ?%");
ps.setString(1, "Having's Quotes");
...