Использование переменных mysql в подготовленном операторе java JDBC

скажем, у меня есть следующий запрос:

SELECT UNIX_TIMESTAMP(Logins.FechaLogin) FROM GA.Logins WHERE Logins.IdEmpleado = ? AND UNIX_TIMESTAMP(Logins.FechaLogin) >= UNIX_TIMESTAMP(?) AND UNIX_TIMESTAMP(Logins.FechaLogin) <= UNIX_TIMESTAMP(?)

И я хочу что-то вроде:

Date = UNIX_TIMESTAMP(Logins.FechaLogin);

SELECT UNIX_TIMESTAMP(Logins.FechaLogin) FROM GA.Logins WHERE Logins.IdEmpleado = ? AND Date >= UNIX_TIMESTAMP(?) AND Date <= UNIX_TIMESTAMP(?)

stmt.setInt(1, EmployeeId);
stmt.setString(2, Date1);
stmt.setString(3, Date2);

Все в подготовленный оператор (JDBC prepareStatement()), есть ли способ сделать что-то подобное, чтобы избежать избыточности в запросе? или это что-то бесполезное? Кстати, я думаю, что функция UNIX_TIMESTAMP должна передаваться на каждой итерации SELECT, если я прав.

Спасибо!


person Neo    schedule 08.07.2013    source источник
comment
Каков тип данных столбца FechaLogin? Разве d >= t AND d <= t не то же самое, что d = t?   -  person spencer7593    schedule 08.07.2013
comment
Это долго, я не указал какой-либо тип данных, потому что это был только пример (я никогда раньше не работал с переменными mysql), но поскольку я форматирую каждую временную метку в время unix, я использую long как тип данных.   -  person Neo    schedule 08.07.2013
comment
Я сделал ошибку, приведя пример, извините за путаницу, посмотрите мой обновленный ответ, спасибо за ваши ответы.   -  person Neo    schedule 08.07.2013
comment
Все, что я хочу сделать, это добавить переменную в подготовленный оператор, а затем использовать ее в запросе, мой вопрос в том, возможно ли это?   -  person Neo    schedule 08.07.2013


Ответы (1)


Короткий ответ: нет, вы не можете ссылаться на переменную MySQL вместо ссылки на столбец или вместо выражения, содержащего ссылки на столбцы. В подготовленном операторе вы можете только «привязать» переменные к значениям; вы не можете «связать» имена таблиц или имена столбцов.

(Это ограничение связано со способом обработки оператора SQL. Когда оператор SQL «подготовлен», оптимизатору необходимо знать все таблицы и столбцы, на которые он ссылается. Он должен убедиться, что ссылки действительны, что пользователь имеет привилегии для объектов, на которые ссылаются, он должен искать типы данных столбцов, проверять наличие подходящих индексов и т. д. Проблема в том, что он не может сделать это, если имена столбцов отсутствуют. Это объясняет, почему вы не сможете t найти какие-либо примеры того, как сделать то, что вы хотите сделать.)

Очевидно, вы можете использовать переменные Java и манипуляции со строками для создания строки, содержащей текст SQL, который будет передан в MySQL. Но окончательная строка, которая передается в MySQL, может иметь заполнители, но они могут быть только заполнителями для значений.

Это должно ответить на ваш вопрос.


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

person spencer7593    schedule 08.07.2013