сообщение об ошибке говорит:
вблизи «0957936101205'AND strike_status = 'ACTIVE'
» в строке 1
Это на самом деле идентификации 0
после '
, который заканчивается текст буквальный начал в первой строке, потому что это Плохой SQL:
SELECT MAX(strike_id) FROM strike WHERE '...'0957936101205'AND strike_status = 'ACTIVE'
-- ^^ BAD
Это код с аннотациями с комментариями:
try(Connection dbConnection = DBConnectionManager.getIntakeConnection();
PreparedStatement preparedStmtSetMaxStrikeId = dbConnection.prepareStatement(
"SELECT MAX(strike_id) FROM strike WHERE 'SELECT p.party_type_id,"
// ^What is this? Even without ' it makes no sense
// ^But it STARTS A TEXT LITERAL
+ "p.csa_score,p.party_tn,p.rec_create_date,"
+ "s.strike_id, s.strike_date, s.strike_level, s.strike_status, s.appealable,s.appeal_status,s.rec_change_date,s.event_id,s.is_email_processed,s.policy_id"
+ "FROM strike s "
// ^Missing space, but it's in a text literal so doesn't matter
+ "INNER JOIN parties p"
+ "ON p.party_id = s.party_id"
// ^Missing space, but it's in a text literal so doesn't matter
+ "WHERE p.account ='"+appealStatus.getSubscriberId()
// ^Missing space, but it's in a text literal so doesn't matter
// ^END TEXT LITERAL from first line
// ^error complains about inserted value 0957936101205
+"'AND strike_status = '"+OCIRISConstants.STRIKE_STATUS_ACTIVE+"' ");)
// ^Starts a new text literal
// ^Missing space, but it's in a text literal so doesn't matter
// ^end text literal
// ^would complain about inserted value ACTIVE
// ^Dangling '
Кроме того, вы не должны использовать конкатенацию для построения SQL, так как это будет вызывать ошибки синтаксиса и оставить вас восприимчивым к SQL Injection атак, позволяя хакерам украсть ваши данные и удалить ваши таблицы.
Предполагая начальное SELECT MAX(... WHERE '
по ошибке, здесь очищена версия, отформатирован для ясности:
String sql = "SELECT p.party_type_id, p.csa_score, p.party_tn, p.rec_create_date" +
", s.strike_id, s.strike_date, s.strike_level, s.strike_status" +
", s.appealable, s.appeal_status, s.rec_change_date, s.event_id" +
", s.is_email_processed, s.policy_id" +
" FROM strike s" +
" INNER JOIN parties p ON p.party_id = s.party_id" +
" WHERE p.account = ?" +
" AND strike_status = ?";
try (Connection conn = DBConnectionManager.getIntakeConnection();
PreparedStatement stmt = conn.prepareStatement(sql)) {
stmt.setString(1, appealStatus.getSubscriberId());
stmt.setString(2, OCIRISConstants.STRIKE_STATUS_ACTIVE);
«а» + «б» + «с» = азбука, а не б с. Возьми? – Strawberry
Что означает 'WHERE 'SELECT'? – Andreas