Использование переменной вместо индекса параметра с подготовленным оператором JDBC

Во многих языках программирования что-то подобное возможно для подготовленных операторов:

PreparedStatement statement = connection.prepareStatement(
    "SELECT id FROM Company WHERE name LIKE ${name}");
statement.setString("name", "IBM");

Но не с помощью java.sql.PreparedStatement. В Java нужно использовать индексы параметров:

PreparedStatement statement = connection.prepareStatement(
    "SELECT id FROM Company WHERE name LIKE ?");
statement.setString(1, "IBM");

Есть ли решение для работы со строковыми переменными, как в первом примере? Является & quot; $ {. *} & Quot; не используется где-либо еще в языке SQL, или есть какие-либо конфликты? Потому что тогда я реализовал бы это сам (синтаксический анализ строки SQL и замена каждой переменной на «?», А затем выполнение Java).

С Уважением, Кай

 akarnokd08 июл. 2009 г., 14:53
Это меня тоже озадачило.javaworld.com/javaworld/jw-04-2007/jw-04-jdbc.html есть то, что я использовал несколько раз.
 Zardoz09 июл. 2009 г., 00:33
Хотя ... спасибо :-)
 akarnokd08 июл. 2009 г., 23:24
@tokel: Я не был уверен, что ваш вопрос теоретический или нет, и мой комментарий на самом деле не отвечает на ваш набранный вопрос.
 O. R. Mapper25 нояб. 2014 г., 16:04
& quot; В Java нужно использовать индексы параметров: & quot; - на самом деле, это не выглядит так в вашем образце. В Java одинcannot even используйте индексы параметров в строке SQL.
 Zardoz08 июл. 2009 г., 15:32
Привет, kd304, мне интересно, почему ты не оставил свое сообщение как ответ, а не использовал комментарий. Потому что я думаю, что это способ для меня решить эту проблему.

Ответы на вопрос(3)

Решение Вопроса

Как упоминалось в комментарии к моему сообщению в kd304, это очень хорошее решение, если вы не хотите включать в свой проект другую стороннюю библиотеку (например, Spring):Статья Javaworld: Именованные параметры для PreparedStatement

JDBC предоставляет эту функциональность черезNamedParameterJdbcTemplate.

 Zardoz08 июл. 2009 г., 15:36
Спасибо за очень хорошее решение. Для меня проблема в том, что это будет частью другой платформы с открытым исходным кодом, и я не хочу импортировать туда столько кода. В противном случае я бы использовал ваше решение :-)

как вы говорите. Это возможно с CallableStatement, но для этого требуется хранимая процедура, а не просто оператор SQL.

Слои ORM, такие как Hibernate, также обеспечивают подстановку именованных параметров, а Hibernate также позволяет выполнять собственный SQL, полностью обходя функциональность сопоставления OR.

Поэтому, если вы действительно хотите использовать именованные параметры, вы можете использовать Hibernate как способ сделать это; Вы будете использовать только небольшую часть его функциональности.

 10 окт. 2017 г., 12:04
Это так печально, поскольку СУБД поддерживает это, по крайней мере, сервер SQL, и JSBC intrnaly создает именованные параметры, например:@P0 nvarchar(4000),@P1 varchar(8000),@P2 nvarchar(4000),@P3 smallint,@P4 nvarchar(4000),@P5 int
 08 июл. 2009 г., 15:14
Забудь о моей идее, у @laz гораздо лучше.
 15 авг. 2012 г., 09:09
Я думаю, что драйвер JDBC Oracle поддерживает вызов обычных операторов SQL с именованными параметрами при использовании CallableStatement, а не только для процедур. PostgreSQL говорит: «Еще не реализует» (PostgreSQL-9.1-901.jdbc4.jar)

Ваш ответ на вопрос