Очень странное PreparedStatement в Java?

#java #sql #jdbc #prepared-statement

#java #sql #jdbc #подготовленное утверждение

Вопрос:

Сегодня я обнаружил очень странное PreparedStatement в программе, исправляющей ошибку, которую я получил. Я отследил его и нашел несколько непонятных SQL. Итак, я не мастер SQL или PreparedStatements, но это кажется очень неправильным. Я должен также упомянуть, что это работает на компьютере коллеги, но не на моем.

 static final String SELECT_UNCOMPLETE_TASKS_FOR_UPGRADE =
"SELECT i.employeeid, i.taskid, i.itptaskarchivecd, i.itptaskstartdt, i.itptaskcompletiondt,t.taskobsoletecd, "
  "t.taskknowledgetx, t.taskProductid, t.taskrfrncid, t.taskcorecd, t.taskwartimecd, t.parentheaderid, "
      "t.taskparentindcd, i.itptaskstatuscd, i.itptaskarchivedt, t.certified "
      "FROM itptask i,task t "
      "WHERE (i.itptaskcompletiondt is NULL "
          "AND i.employeeid = ?1 "
          "AND i.taskid = t.taskid "
          "AND i.itptaskarchivecd = ?2 "
          "AND t.taskproductcd = ?3 "
          "AND t.taskobsoletecd = ?4 "
          "AND t.taskcorecd = ?5) "
      "OR (i.employeeid = ?6 "
          "AND i.taskid = t.taskid "
          "AND 'T' = t.taskparentindcd "
          "AND t.taskproductcd = ?7)";
  

Мой вопрос прост, для чего нужны цифры после заполнителей параметров (вопросительных знаков)? Если это совершенно неправильный синтаксис, что позволило бы ему работать в другом рабочем пространстве / среде? Любая помощь была бы высоко оценена. Спасибо.

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

1. какой драйвер jdbc вы используете?

2. какую ошибку вы получаете?

3. @Pranalee: ORA-00933: команда SQL не завершена должным образом

4. Ваш коллега использует тот же драйвер?

5. Это похоже на какой-то заполнитель, на который позже будут ссылаться в коде. Вы уверены, что эта переменная не используется / не изменяется где-то еще в коде? Возможно, использовать в качестве шаблона для создания фактического оператора?

Ответ №1:

Этот конкретный синтаксис выглядит специфичным для синтаксиса JPA. В JPA вы могли бы указать ?#, чтобы указать индекс параметра через объект запроса.

 Query myQuery = entityManager.createNativeQuery("select * from my_table where foo = ?1 and bar = ?2");

q.setParameter(1,myFoo);
q.setParameter(2,myBar);
  

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

1. Было бы это по-прежнему, если бы оно использовалось как традиционное PreparedStatement, т.Е. ps = conn.prepareStatement(ITPQueryHelperSQL.SELECT_UNCOMPLETE_TASKS_FOR_UPGRADE);?

2. @Justin Нет, если только драйвер специально не поддерживает нестандартный (который не указан в JDBC / SQL) способ определения параметров запроса. JDBC поддерживает только простые позиционные параметры (т. Е.: ? ).