java - MySql异常语法错误

标签 java mysql jdbc

执行 servlet 时出现 MySQL 异常。我找不到查询中语法出错的地方。我正在关注异常 -

com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: 您的 SQL 语法有错误;查看与您的 MySQL 服务器版本对应的手册,了解在 's1.employee_id='I123' 和 s1.creation_date= DATE_FORMAT(sysdate(), '%Y-%m-%d') -' 附近使用的正确语法第 1 行

下面是包含 mysql 查询的 servlet -

   import java.io.IOException;
    import java.sql.ResultSet;
    import java.text.SimpleDateFormat;

    import java.util.Date;
    import java.util.Locale;

    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;

    public class HomepageTable extends connection {
        String sql,table;
        ResultSet rs = null;
        private static final long serialVersionUID = 1L;
        Date now = new Date();

        SimpleDateFormat dateFormat = new SimpleDateFormat("EEE", Locale.US); 
        String asWeek = dateFormat.format(now);

        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            try
            {
                System.out.println(asWeek);
                get_connection();
            if(asWeek.equals("Mon"))
            {
                sql="select e1.employee_name,d1.dealer_name , d2.distributor_name ,  s1.invoice_id ,s1.invoice_created_date, r1.region_name , a1.area_name , s1.payment_date, s1.amount " +
                        "from sales_master_table s1 " +
                        "left join dealers_info d1 on s1.dealer_visited = d1.dealer_id " +
                        "left join distributors_info d2 on s1.distributor_visited = d2.distributor_id " +
                        "left join territory_master_table r1 on r1.region_code = s1.region" +
                        "left join area_master_table a1 on a1.area_code = s1.area" +
                        "left join employee_master_table e1 on e1.employee_id=s1.employee_id" +
                        "where " +
                        "s1.employee_id=? and" +
                        "s1.creation_date= DATE_FORMAT(sysdate(), '%Y-%m-%d')- INTERVAL 2 DAY" +
                        "union" +
                        "select e1.employee_name,d1.dealer_name , d2.distributor_name ,  s1.invoice_id ,s1.invoice_created_date, r1.region_name , a1.area_name , s1.payment_date, s1.amount " +
                        "from sales_master_table s1" +
                        "left join dealers_info d1 on s1.dealer_visited = d1.dealer_id" +
                        "left join distributors_info d2 on s1.distributor_visited = d2.distributor_id " +
                        "left join territory_master_table r1 on r1.region_code = s1.region" +
                        "left join area_master_table a1 on a1.area_code = s1.area" +
                        "left join employee_master_table e1 on e1.employee_id=s1.employee_id" +
                        "where" +
                        "s1.creation_date= DATE_FORMAT(sysdate(), '%Y-%m-%d')- INTERVAL 2 DAY" +
                        "and level1_head = (select distinct e2.employee_name from employee_master_table e2 , sales_master_table s2" +
                        "where e2.employee_id=s2.employee_id and s2.employee_id=?)" +
                        "or level2_head = (select distinct e2.employee_name from employee_master_table e2 , sales_master_table s2" +
                        "where e2.employee_id=s2.employee_id and s2.employee_id=?)" +
                        "or level3_head= (select distinct e2.employee_name from employee_master_table e2 , sales_master_table s2" +
                        "where e2.employee_id=s2.employee_id and s2.employee_id=?)";
            }
            else
            {
                sql="(select e1.employee_name,d1.dealer_name , d2.distributor_name ,  s1.invoice_id ,s1.invoice_created_date, r1.region_name , a1.area_name , s1.payment_date, s1.amount " +
                    "from sales_master_table s1 " +
                    "left join dealers_info d1 on s1.dealer_visited = d1.dealer_id " +
                    "left join distributors_info d2 on s1.distributor_visited = d2.distributor_id " +
                    "left join territory_master_table r1 on r1.region_code = s1.region" +
                    "left join area_master_table a1 on a1.area_code = s1.area" +
                    "left join employee_master_table e1 on e1.employee_id=s1.employee_id" +
                    "where " +
                    "s1.employee_id=? and " +
                    "s1.creation_date= DATE_FORMAT(sysdate(), '%Y-%m-%d')-INTERVAL 2 DAY)" +
                    " union" +
                    "(select e1.employee_name,d1.dealer_name , d2.distributor_name ,  s1.invoice_id ,s1.invoice_created_date, r1.region_name , a1.area_name , s1.payment_date, s1.amount " +
                    "from sales_master_table s1" +
                    "left join dealers_info d1 on s1.dealer_visited = d1.dealer_id" +
                    "left join distributors_info d2 on s1.distributor_visited = d2.distributor_id " +
                    "left join territory_master_table r1 on r1.region_code = s1.region" +
                    "left join area_master_table a1 on a1.area_code = s1.area" +
                    "left join employee_master_table e1 on e1.employee_id=s1.employee_id" +
                    "where " +
                    "s1.creation_date= DATE_FORMAT(sysdate(), '%Y-%m-%d')- INTERVAL 2 DAY" +
                    "and level1_head = (select distinct e2.employee_name from employee_master_table e2 , sales_master_table s2" +
                    "where e2.employee_id=s2.employee_id and s2.employee_id=?)" +
                    "or level2_head = (select distinct e2.employee_name from employee_master_table e2 , sales_master_table s2" +
                    "where e2.employee_id=s2.employee_id and s2.employee_id=?)" +
                    "or level3_head= (select distinct e2.employee_name from employee_master_table e2 , sales_master_table s2" +
                    "where e2.employee_id=s2.employee_id and s2.employee_id=?))";

            }

                 st=con.prepareStatement(sql);
                 HttpSession session = request.getSession();

                 String userid = (String)session.getAttribute("userid");

                 st.setString(1, userid);
                 st.setString(2, userid);
                 st.setString(3, userid);
                 st.setString(4, userid);
                rs =  st.executeQuery();
                table="<thead>" +
                        "<tr>" +
                        "<td>Dealer</td>" +
                        "<td>Distributor</td>" +
                        "<td>Region</td>" +
                        "<td>Area</td>" +
                        "<td>Invoice Date</td>" +
                        "<td>Payment Date</td>" +
                        "<td>Amount</td>" +
                        "</tr></thead><tbody>";

                while(rs.next())
                {   table+="<tr>";
                    table+="<td>"+rs.getString("Dealer_name")+"</td>";
                    table+="<td>"+rs.getString("distributor_name")+"</td>";
                    table+="<td>"+rs.getString("region_name")+"</td>";
                    table+="<td>"+rs.getString("area_name")+"</td>";
                    table+="<td>"+rs.getString("invoice_created_date")+"</td>";
                    table+="<td>"+rs.getString("payment_date")+"</td>";
                    table+="<td>"+rs.getString("amount")+"</td>";
                    table+="</tr>";
                }
                table+="</tbody>";
                response.getWriter().print(table);
                st.close();
                rs.close();
                close_connection();
            }

            catch(Exception e)
            {
                e.printStackTrace();
            }
        }

    }

最佳答案

"left join employee_master_table e1 on e1.employee_id=s1.employee_id" +
"where" +
"s1.creation_date= DATE_FORMAT(sysdate(), '%Y-%m-%d')- INTERVAL 2 DAY" +

在许多地方,您没有在关键字之间添加空格。上面的片段变成:

left join employee_master_table e1 on e1.employee_id=s1.employee_idwheres1.creation_date= DATE_FORMAT(sysdate(), '%Y-%m-%d')- INTERVAL 2 DAY
                                      xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

不要像这样构建 SQL。尝试使用存储过程或至少将查询从您的代码中取出并放入资源文件中。

关于java - MySql异常语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16996265/

相关文章:

使用 spring 事务的 Java 7 try-with-resources 导致提交时连接关闭

java - 将扫描仪中的单词处理为字符串数组

mysql - 如何取消选择mysql默认数据库?

java - 什么是更快的 : JDBC or JNDI?

php - facebook用户ID的数据类型是什么

php - 使用 session 变量获取当前用户 ID

java - IO 错误 : The Network Adapter could not establish the connection

java - Android - 使用 Handler 和 postDelayed 定期运行方法

Java、Hibernate - 运行现有项目时发生运行时异常

java - 如何调试 NullPointerException?