Параметры нельзя использовать для параметризации таблицы или параметризации каких-либо объектов базы данных. В основном они используются для параметризации предложений WHERE / HAVING.
Чтобы сделать то, что вы хотите, вам нужно будет выполнить замену самостоятельно и при необходимости создать регулярный оператор.
Когда вы используете подготовленный оператор, это подсказка базе данных о необходимости предварительной обработки оператора - например, проанализировать строку и, возможно, определить план выполнения. Если объекты, используемые в запросе, могут изменяться динамически, тогда база данных не сможет выполнить большую предварительную подготовку.
К сожалению, вы не можете параметризовать имена таблиц для подготовленных операторов. При желании вы можете создать String и выполнить его как динамический SQL.
Я сомневаюсь, что ваш SQL действительно бесконечно гибок. У вас есть только конечное количество таблиц, поэтому количество статических конечных строк для выражения необходимого вам SQL также является конечным.
Продолжайте использовать PreparedStatement и привязывайте свои переменные. Это того стоит, особенно если вы избегаете проблем с SQL-инъекциями.
Ошибка в том, что вы не можете передать имя таблицы в качестве параметра. Вы должны передавать значения только в SQL Statement.
Например: Если вы хотите :
Select * from LoggedUsers where username='whatever' and privilege='whatever';
то вы должны построить PreparedStatement как :
Select * from LoggedUsers where username=? and privilege=?
setString(1, usernameObject);
setString(2, privilegeObject);
Цель PreparedStatement - уменьшить сложность и читабельность кода подключения к базе данных. Когда разработчику приходится использовать так много значений столбцов с экземпляром Statement'а, так трудно ставить точки с запятой, запятые и плюс (оператор concat).
Я думаю, что вы ошибочно хотите воспользоваться этим, что не предназначено для этого....