你能告诉我为什么我会得到"不能使用在PreparedStatement上接受查询字符串的查询方法."?

May*_*ots 10 java postgresql prepared-statement

我一直遇到错误"无法使用在PreparedStatement上接受查询字符串的查询方法." 在尝试调试以下代码和SQL Select查询时.(Postgres 9.4,jdk 1.8)也许我是盲人,这是一个简单的类型,但我可以使用一些帮助.

我的控制台输出:

SELECT rowid,firstname,lastname,prefname,email1,email2,email3,type,status,preflang,mbrappid,deviceid,mbrstatus,mbrtype,mbrcat,pr_phonevoice FROM qbirt.person WHERE pr_sms = 47 ORDER BY lastupdt DESC

ERROR JDBC在主电话FKey上准备了Stmt错误...电话FKey:47

SQLException:无法使用在PreparedStatement上获取查询字符串的查询方法.SQLState:42809 VendorError:0 org.postgresql.util.PSQLException:无法使用在PreparedStatement上获取查询字符串的查询方法.at theg.postgresql.jdbc.PgPreparedStatement.executeQuery(PgPreparedStatement.java:102)at solutions.demand.qbirt.Person.findMember(Person.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);   <-------
Run Code Online (Sandbox Code Playgroud)

我已确认这些字段包含以下值:
foundMbr= false,foundPhoneID= 47,mode= 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;";

我收到了错误: ResultSet rs = pStmt.executeQuery(qry);

正如您在控制台中看到的,我甚至已经确认pStmt正在保持正确的绑定,因为我将其打印出来. - 也就是说,似乎错过了结尾';'.不知道为什么那是因为我可以在qry字符串中看到它.我认为这只是preparedStatment的一个怪癖.

我还将这个确切的SQL复制到pgAdmin III并成功手动执行.虽然,我确实必须加回';'.我在许多其他领域使用几乎相同的代码没有问题.

可能是失踪的';'?
也许某种类型不匹配?(foundPhoneID是一个i​​nt.,rowid是一个串行/整数,pr_sms是一个整数FKey)
它可能是定义qry字符串的if语句块吗?

TIA!

Mon*_*ois 23

尝试做:

pStmt.executeQuery()
Run Code Online (Sandbox Code Playgroud)

代替

pStmt.executeQuery(qry)
Run Code Online (Sandbox Code Playgroud)

如本问题所述

  • 该死的。谢谢。(对这个骗子表示抱歉!) (2认同)