Java 你能告诉我为什么我得到“不能使用在PreparedStatement上接受查询字符串的查询方法”吗?

Java 你能告诉我为什么我得到“不能使用在PreparedStatement上接受查询字符串的查询方法”吗?,java,postgresql,prepared-statement,Java,Postgresql,Prepared Statement,我不断遇到错误,无法使用在PreparedStatement上获取查询字符串的查询方法。尝试调试以下代码时&SQL选择查询。Postgres9.4,JDK1.8也许我是盲人,这是一种简单的类型,但我需要一些帮助 我的控制台输出: 从qbirt.person中选择rowid、firstname、lastname、prefname、email1、email2、email3、类型、状态、preflang、mbrappid、设备ID、mbrstatus、mbrtype、mbrcat、pr_phonevo

我不断遇到错误,无法使用在PreparedStatement上获取查询字符串的查询方法。尝试调试以下代码时&SQL选择查询。Postgres9.4,JDK1.8也许我是盲人,这是一种简单的类型,但我需要一些帮助

我的控制台输出:

从qbirt.person中选择rowid、firstname、lastname、prefname、email1、email2、email3、类型、状态、preflang、mbrappid、设备ID、mbrstatus、mbrtype、mbrcat、pr_phonevoice,其中pr_sms=47 ORDER BY lastupdt DESC

E R R O R 主电话FKey上的JDBC准备Stmt错误。。。 电话:47

SQLException:无法使用在PreparedStatement上获取查询字符串的查询方法。 SQLState:42809 供应商错误:0 org.postgresql.util.psqleException:无法使用在PreparedStatement上获取查询字符串的查询方法。 在org.postgresql.jdbc.PgPreparedStatement.executeQueryPgPreparedStatement.java:102 at solutions.demand.qbirt.Person.findMemberPerson.java:762`

代码部分:

            if (!foundMbr && foundPhoneID > 0) {
                if (QbirtUtils.verbose) {
                    System.out.println("Querying Person by FK ID for phones: " + foundPhoneID + "\n");
                }

                if (mode.equals(pMode.SMS)) {
                    qry = "SELECT rowid, firstname, lastname, prefname, email1, email2, email3, type, "
                            + "status, preflang, mbrappid, deviceid, mbrstatus, mbrtype, mbrcat, pr_phonevoice "
                            + "FROM qbirt.person "
                            + "WHERE pr_sms = ? "
                            + "ORDER BY lastupdt DESC;";
                } else {
                    if (mode.equals(pMode.VOICE)) {
                        qry = "SELECT rowid, firstname, lastname, prefname, email1, email2, email3, type, "
                                + "status, preflang, mbrappid, deviceid, mbrstatus, mbrtype, mbrcat, pr_phonevoice "
                                + "FROM qbirt.person "
                                + "WHERE pr_phonevoice = ? "
                                + "ORDER BY lastupdt DESC;";
                    } else { 
                        if (mode.equals(pMode.PHONE)) {
                            qry = "SELECT DISTINCT ON (rowid) rowid, firstname, lastname, prefname, email1, email2, email3, type, "
                                    + "status, preflang, mbrappid, deviceid, mbrstatus, mbrtype, mbrcat, pr_phonevoice "
                                    + "FROM qbirt.person "
                                    + "WHERE (pr_sms = ? OR pr_phonevoice = ?) "
                                    + "ORDER BY lastupdt DESC, rowid DESC;";
                        }
                    }
                }



                try {
                    PreparedStatement pStmt = conn.prepareStatement(qry);
                    pStmt.setInt(1, foundPhoneID);
                    if (mode.equals(pMode.PHONE)) {
                        pStmt.setInt(2, foundPhoneID);
                    }
                    System.out.println(pStmt.toString());
                    ResultSet rs = pStmt.executeQuery(qry);   <-------
我已确认字段包含以下值: foundMbr=false,foundPhoneID=47,mode=SMS,该qry=从qbirt.person中选择rowid、firstname、lastname、prefname、email1、email2、email3、type、status、preflang、mbrappid、deviceid、mbrstatus、mbrtype、mbrcat、pr_phonevoice,其中pr_SMS=?由lastupdt DESC;订购

我在以下行中得到错误:ResultSet rs=pStmt.executeQueryqry

正如您在控制台中看到的,我甚至确认pStmt具有正确的绑定,因为我打印了它。-也就是说,它似乎错过了结尾“;”。不知道为什么,因为我可以在qry字符串中看到它。我想这只是准备工作中的一个怪癖

我还将这个SQL复制到pgAdmin III中,并成功地手动执行它。尽管如此,我还是不得不加上“;”。我在许多其他领域使用了几乎相同的代码,没有问题

可能是缺少的“;”吗? 也许是某种类型的不匹配?foundPhoneID是一个整数,rowid是一个串行/整数,pr_sms是一个整数FKey 是否可能是定义qry字符串的if语句块

蒂亚

试着做:

pStmt.executeQuery()
而不是

pStmt.executeQuery(qry)

正如这篇

该死的文章中所讨论的。谢谢很抱歉被骗了!