【问题标题】:SQL not working with ResultSetSQL 不适用于 ResultSet
【发布时间】:2018-08-28 10:28:52
【问题描述】:

SQL 在 SQL 开发人员中运行良好,但是当我尝试在 ResultSet 中使用它时,它会抛出 Invalid Column Name 错误,代码:

  String assignList = "SELECT table1.name , table1.spads , table1.group , table1.id , max(table2.date_) ,max(table2.event) "
                    + " FROM FOMOWNER_LSR.table1 LEFT OUTER JOIN   ( SELECT id, MAX(date_) AS latest FROM FOMOWNER_LSR.table2  GROUP BY id )  rev "
                    + " ON rev.id = table1.id LEFT OUTER JOIN FOMOWNER_LSR.table2  ON table2.id = rev.id "
                    + " AND table2.date_ = rev.latest group by table1.name , table1.spads , table1.group ,table1.id order by table1.id desc " ;


            PreparedStatement assignListStmt = null;
            Connection conn = null;
            ResultSet rs = null;

            // StringBuffer body = new StringBuffer();
            try {

                ArrayList<getssets> getset = new ArrayList<getssets>();
                //conn = DriverManager.getConnection("jdbc:oracle:thin:@hw-dbt-rac.syniverse.com:1521/WLNPT", "utlapp100", "g0wlnp");
                System.out.println("before calling fomlsr DB connection");
                conn = DBConnector.getConnection();
                System.out.println("after calling fomlsr DB connection");
                if (conn == null)
                    throw new SQLException("NULL connection in GUIActionClass");
                if (conn.isClosed())
                    throw new SQLException("Connection is closed");
                conn.setAutoCommit(false);
                System.out.println("DB CONNECTION ESTABLISHED");
                assignListStmt = conn.prepareStatement(assignList);
                rs = assignListStmt.executeQuery();
                System.out.println("After the execute query");
                while (rs.next()) {
                    getssets guiAssign = new getssets();
                    guiAssign.setName(rs.getString("name"));
                    guiAssign.setspads(rs.getString("spads"));
                    guiAssign.setgroup(rs.getString("group"));
                    guiAssign.setId(rs.getString("id"));
                    guiAssign.setDate(rs.getTimestamp("date_"));
                    guiAssign.setEvent(rs.getString("event"));
                    getset.add(guiAssign);

                }

另一个带有setter和getter的类文件(getssets)

private String name;
    private String spads;
    private String group;
    private String id;
    private String date_;
    private String event;



public String getName() {
    return nullToEmpty(name);
}
public void setName(String name) {
    this.name = name;
}
public String getspads() {
    return nullToEmpty(spads);
}
public void setspads(String spads) {
    this.spads = spads;
}
public String getgroup() {
    return nullToEmpty(group);
}
public void setgroup(String group) {
    this.group = group;
}
public String getId() {
    return nullToEmpty(id);
}
public void setId(String id) {
    this.id = id;
}
public String getDate() {
    return nullToEmpty(date_);
}
public void setDate(String date_) {
    this.date_ = date_;
}
public String getEvent() {
    return nullToEmpty(event);
}
public void setEvent(String Event) {
    this.event = event;
}   
private String nullToEmpty(String st){
    if(st==null)
        st = "";
    return st; 

我的任务是使用 JSP 在 GUI 中打印这些值。

以下是我在日志中遇到的错误

java.sql.SQLException: Invalid column name
        at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
        at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146)
        at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:208)
        at oracle.jdbc.driver.OracleStatement.getColumnIndex(OracleStatement.java:3291)
        at oracle.jdbc.driver.OracleResultSetImpl.findColumn(OracleResultSetImpl.java:1914)
        at oracle.jdbc.driver.OracleResultSet.getString(OracleResultSet.java:1515)
        at weblogic.jdbc.wrapper.ResultSet_oracle_jdbc_driver_OracleResultSetImpl.getString(Unknown Source)
        at com.tsiconnections.fom.action.GUIActionClass.execute(GUIActionClass.java:83)
        at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:484)
        at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274)
        at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1480)
        at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:506)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
        at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
        at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
        at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:301)
        at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:184)
        at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3750)
        at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3714)
        at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
        at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120)
        at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2283)
        at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2182)
        at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1491)
        at weblogic.work.ExecuteThread.execute(ExecuteThread.java:256)
        at weblogic.work.ExecuteThread.run(ExecuteThread.java:221)
<Aug 28, 2018 5:52:15 AM EDT> <Error> <com.tsiconnections.fom.action.GUIActionClass> <BEA-000000> <SQLException: Invalid column name>
com.tsiconnections.fom.exception.FilterServiceException
        at com.tsiconnections.fom.action.GUIActionClass.execute(GUIActionClass.java:96)
        at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:484)
        at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274)
        at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1480)
        at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:506)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
        at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
        at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
        at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:301)
        at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:184)
        at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3750)
        at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3714)
        at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
        at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120)
        at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2283)
        at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2182)
        at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1491)
        at weblogic.work.ExecuteThread.execute(ExecuteThread.java:256)
        at weblogic.work.ExecuteThread.run(ExecuteThread.java:221)
<Aug 28, 2018 5:52:15 AM EDT> <Error> <HTTP> <BEA-101020> <[ServletContext@157132757[app:fomWebLSR module:fomWebLSR path:/fomWebLSR spec-version:null]] Servlet failed with Exception
java.lang.NullPointerException
        at org.apache.struts.action.RequestProcessor.processForwardConfig(RequestProcessor.java:441)
        at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:279)
        at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1480)
        at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:506)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
        Truncated. see log file for complete stacktrace
>

名称为“date_”的列在 SQL 和 Java 中是否可接受? 我可以使用字符串来获取日期和时间吗? 还有什么需要验证的?

【问题讨论】:

  • 让我们从基本检查开始。您的原始 SQL 查询在 Oracle 上执行是否没有任何问题?
  • “列名无效”表示您选择的列不存在。
  • 你班上的 GUIActionClass.java:83 行是什么?
  • 此查询在 SQL developer 中运行良好。第 83 行是“ tpassignment.setDate(rs.getString("date_"));"
  • 请努力将您的代码示例精简到表达您的观点所需的最低限度。 stackoverflow.com/help/mcve

标签: java sql oracle resultset


【解决方案1】:

你的列名要一致,把SQL中的最后一列改成别名:

max(table2.date_) as date_ ,max(table2.event) as event

【讨论】:

  • 我认为查询和Java代码还有很多其他问题。
  • 你能帮忙识别一下吗
  • 嗨,在进行“max(table2.date_) as date_,max(table2.event) as event”这个更改后,我没有收到无效列错误并且能够在 GUI 页面中看到列.但是 Event 列仍然没有填充。事件列有“xyz 上次更新”等 cmets。
  • @chaatat 你不是在 group by 子句中缺少table1.event 吗?应该以 ,table1.event order by table1.id desc " ; 结尾
  • 嗨,我给了 max(table1.event) ,所以不必按克劳德包含在组中。现在这个事件也起作用了。我在字符串大写和小写中犯了一个错误。将所有内容更改为小写后,它起作用了感谢您的即时帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-04
  • 1970-01-01
  • 2015-03-14
  • 1970-01-01
  • 2015-07-25
相关资源
最近更新 更多