使用mysql变量转换成java JDBC预编译语句

时间:2013-07-08 18:06:27

标签: java mysql variables 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()),有没有办法可以做这样的事情以避免冗余进入查询?或者这是没用的东西?顺便说一下,如果我是正确的话,我认为必须在每次SELECT迭代中传递UNIX_TIMESTAMP函数。

感谢的!

1 个答案:

答案 0 :(得分:1)

简短的回答是否定的,您不能引用MySQL变量来代替列引用,也不能代替包含列引用的表达式。在准备好的语句中,您只能将变量“绑定”到值;你不能“绑定”表名或列名。

(此限制与处理SQL语句的方式有关。当SQL语句“准备好”时,优化器需要知道所引用的所有表和列。它必须验证引用是有效的,用户对引用的对象有权限,它必须查找列的数据类型,检查合适的索引,等等。问题是如果缺少列名,它就不能这样做。这就解释了为什么你找不到任何你想做的事情的例子。)

显然,您可以利用Java变量和字符串操作来生成包含将传递给MySQL的SQL文本的String。但传递给MySQL的最终字符串可以有占位符,但那些只能是值的占位符。

那应该回答你的问题。


关于UNIX_TIMESTAMP函数的使用(无论是必要的还是可取的),我们可以做出其他几个注释,包含函数的列引用的谓词的性能影响等等。但那些并没有真正回答这个问题你在问。