Java 2参数PreparedStatement在第二个参数附近抛出语法错误SQL状态42601

Java 2参数PreparedStatement在第二个参数附近抛出语法错误SQL状态42601,java,sql,postgresql,jdbc,Java,Sql,Postgresql,Jdbc,我正在创建一个简单的java应用程序,它使用我已经创建的postgresql数据库。数据库已经创建,而不是应用程序。 其中一个表称为“Employee”。 它有一个名为“eid”的属性,是员工id的缩写 我试图使用PreparedStatement来泛化数据库选择查询。我想有两个参数是广义的。我还想得到结果的长度,所以我创建了第二个PreparedStatement来查找它 代码看起来很简单,但我总是遇到同样的语法错误 以下是我尝试运行的代码: public static String[

我正在创建一个简单的java应用程序,它使用我已经创建的postgresql数据库。数据库已经创建,而不是应用程序。 其中一个表称为“Employee”。 它有一个名为“eid”的属性,是员工id的缩写

我试图使用PreparedStatement来泛化数据库选择查询。我想有两个参数是广义的。我还想得到结果的长度,所以我创建了第二个PreparedStatement来查找它

代码看起来很简单,但我总是遇到同样的语法错误

以下是我尝试运行的代码:

    public static String[] select(Connection conn, String arguments) {

        try {

            PreparedStatement preparedSelect = conn.prepareStatement("SELECT ? FROM ?");
            PreparedStatement preparedCount = conn.prepareStatement("SELECT COUNT(*) FROM ?");

            String[] arrOfStr = arguments.split(" ", 0);

            System.out.println(arrOfStr[0].equals("eid"));
            System.out.println(arrOfStr[1].equals("Employee"));

            preparedSelect.setString(1, arrOfStr[0]);
            preparedSelect.setString(2, arrOfStr[1]);
            preparedCount.setString(1, arrOfStr[1]);

            ResultSet rsSelect = preparedSelect.executeQuery();
            ResultSet rsCount = preparedCount.executeQuery();

            ...
在第一行的参数中,我希望SELECT查询为:SELECT eid FROM Employee。 在第二行的参数中,我希望SELECT查询为:SELECT COUNT*FROM Employee

使用此应用程序的用户在程序的前面输入select函数参数中的参数。arrOfStr字符串数组将包含这两个字符串:eid和Employee

为了检查arrOfStr是否具有正确的值,我打印了由.equals函数生成的布尔值,将这些值与我想要的字符串进行比较,这些字符串同样是eid和Employee

在控制台中,结果是,我并不惊讶:

true
true
因此,在接下来的3行中,我将字符串值eid和Employee设置到PreparedStatements中

最后,我执行以下两行中的查询。我尝试过切换这两个查询执行,但它们都给了我一个非常类似的错误。对于给定的代码,我得到一个错误:

SQL State: 42601
ERROR: syntax error at or near "$2"
  Position: 16
这说明字符串Employee的语法有问题

当我直接进入postgresql数据库并输入:

SELECT eid FROM Employee;
我得到输出:

1663
1983
1357
...

有人能解释一下这个语法错误吗?

正如Elliott提到的,您不能以这种方式绑定表名

要实现您的目标,请尝试以下方法:

String[] arrOfStr = arguments.split(" ", 0);

PreparedStatement preparedSelect = conn.prepareStatement("SELECT ? FROM " + arrOfStr[1]);
PreparedStatement preparedCount = conn.prepareStatement("SELECT COUNT(*) FROM " + arrOfStr[1]);

不能在查询中绑定表名或列名;准备好的语句不是这样实现的。从名称为“”的员工中选择EID?是允许的。你不能放?就在任何地方。