【问题标题】:JDBC SQL query string problemJDBC SQL查询字符串问题
【发布时间】:2011-09-04 18:36:15
【问题描述】:

我在将 sql 查询作为字符串插入 java 时遇到了一些问题。当我将文本直接粘贴到其中时,它不会将其保留为字符串(不知道为什么,因为其中没有双引号),所以我尝试逐行对其进行格式化,但随后出现 sql 异常(并且我知道查询有效) .谁能发现什么给我的问题?如果没有,有没有更好的方法可以插入 sql 代码?谢谢

public FratReport getFratReport() throws SQLException {
            FratReport newfrat = new FratReport();
            Statement stmt;
            ResultSet results;
            String myQuery;
            myQuery = String.format("select m.nickname,"
                    +" case"
                    +" when stat_nrOfBookings/date_part('days', now()-stat_since)<0.035714 then 1"
                    +" when stat_nrOfBookings/date_part('days', now()-stat_since)<0.07142858 then 2"
                    +" when stat_nrOfBookings/date_part('days', now()-stat_since)<0.1785715 then 3"
                    +" when stat_nrOfBookings/date_part('days', now()-stat_since)<0.2857143 then 4"
                    +" else 5 end as freq,"
                    +" case"
                    +" when stat_sumPayments < 10000 then 1"
                    +" when stat_sumPayments < 100000 then 2"
                    +" when stat_sumPayments < 250000 then 3"
                    +" when stat_sumPayments < 500000 then 4"
                    +" else 5 end as am,"
                    +" case"
                    +" when count = null then 'weekday'"
                    +" when stat_nrOfBookings-count > count then 'weekday'"
                    +" else 'weekend' end as typ,"
                    +" case"
                    +" when max = null then 0"
                    +" when max<(now()-interval '4 weeks') then 1"
                    +" when max<(now()-interval '2 weeks') then 2"
                    +" when max<(now()-interval '1 week') then 3"
                    +" when max<(now()-interval '1 days') then 4"
                    +" else 5 end as rece"
                    +" from (member natural join memberstats) as m join"
                    +" (select rece.nickname, max, count from"
                    +" (select nickname , max(whenbooked) from member full join booking on member.memberNo = booking.madeBy group by member.nickname) as rece"
                    +" full join"
                    +" (select nickname, count from member full join (select nickname as nn, count(*) from (select nickname, to_char(whenbooked, 'D') from member left outer join booking on member.memberno = booking.madeBy) as days where to_char = '7' or to_char = '6' group by nickname) as c on member.nickname = c.nn) as daycount"
                    +" on rece.nickname = daycount.nickname)"
                    +" as n"
                    +" on m.nickname = n.nickname"
                    +" order by freq desc, rece desc, am desc, typ desc");


            try {
                stmt = conn.createStatement();
                results = stmt.executeQuery(myQuery);
                String newString;
                while (results.next()) {
                            newString = results.getString("nickname") + " " + 
                            Integer.toString(results.getInt("rec"))+ " " + 
                            Integer.toString(results.getInt("am")) +" "+ 
                            results.getString("type");
                    newfrat.addLine(newString);
                }
                stmt.close();
                results.close();
            }
            catch(SQLException e){System.out.println("yep");}
            return newfrat;
}

【问题讨论】:

标签: sql string jdbc


【解决方案1】:

随机一行:

+"when stat_sumPayments < 10000 then 1"
+"when stat_sumPayments < 100000 then 2"

显然,这会在连接时给您带来语法错误:

when stat_sumPayments < 10000 then 1when stat_sumPayments < 100000 then 2
                                   ^^

解决方法是在每行末尾添加一个空格。

+"when stat_sumPayments < 10000 then 1 "
+"when stat_sumPayments < 100000 then 2 "

除此之外,如果您坚持使用 JDBC 而不是构建在 JDBC 之上的任何框架,那么这就是“最先进的”。否则,我可以推荐我的数据库抽象框架 jOOQ。它将帮助您在 Java DSL 中表达上述复杂查询,而不会冒此类语法错误的风险:

http://www.jooq.org

【讨论】:

  • 不幸的是它是 uni 所以我真的别无选择。谢谢我更改了代码,但仍然遇到同样的问题。上面的修改代码
  • ...或者你可以在每行的开头添加空格,如果这对你有用的话——我个人觉得这样更容易发现任何缺失的空格。此外,值得记录您发送到数据库的 SQL 字符串(每次都在“调试”级别进行,或者仅在遇到异常时选择性地进行)。这样你就可以在日志中得到显式查询,而且通常很容易看到这种东西。
  • 它捕获了一个 sql 异常,并且我在同一个数据库的 pgadminIII 中成功使用了相同的查询。
  • then 之前需要一个空格:...when stat_nrOfBookings/date_part('days', now()-stat_since)&lt;0.07142858then 2...
  • 现在,我会删除 String.format() 因为你并没有真正使用它。只是为了防止副作用。无论如何,适合您的方法是记录或System.out.println() 您的 SQL 并尝试直接在 pgAdmin III 中执行它。如果您在 JDBC 中有语法错误,它就不会在那里工作。这样,您可能更容易找到问题所在。
猜你喜欢
  • 2011-12-05
  • 1970-01-01
  • 1970-01-01
  • 2013-05-28
  • 2012-09-21
  • 1970-01-01
  • 1970-01-01
  • 2019-05-15
  • 1970-01-01
相关资源
最近更新 更多