2017-10-20 187 views
0

我想从控制器传递连接查询结果来查看,但我得到 错误“java.lang.NumberFormatException:For input string:”id “java.lang.NumberFormatException:对于输入字符串:“ID”为休眠

我已经经历重复的问题,并适用于我的情况的解决方案,但它是没有得到成功。 Duplicated Question -1Duplicated Question -2Duplicated Question -3

DAO代码

public List<Object [] > showEmployee_Role(){ 

    try { 

      Session session=HibernateUtil.getSessionFactory().openSession(); 
      SQLQuery query = session.createSQLQuery("select e.id as eid , r.id as rid , e.ename , e.enumber , r.description from employee_profile e INNER JOIN role r ON (e.role_id = r.id)"); 

      List <Object []> employee_role =query.list(); 
      return employee_role; 

    } catch (Exception e) { 

     System.out.println("Error in Show Employee_Role"+e.getMessage()); 
    } 

    return null; 

} 

控制器代码

 List<Object []>showEmployee_role=employeeDaoImpl.showEmployee_Role(); 
     request.setAttribute("employeeList", showEmployee_role); 
     RequestDispatcher rd = request.getRequestDispatcher("EmployeeView.jsp"); 
     rd.forward(request, response); 

查看代码

<c:forEach items="${employeeList}" var="emp"> 

     <tr> 
     <td> ${emp.id} </td> 
     <td> ${emp.ename} </td> 
     <td> ${emp.enumber}</td> 
     <td> ${emp.description}</td> 
    </tr> 
    </c:forEach> 

雇员实体

@Entity(name="employee_profile") 
public class Employee implements Serializable{ 


private int id; 
private String ename; 
private String enumber; 
private Role role; 
private Collection <Task> task; 



public Employee() { 

} 


public Employee(String ename,String enumber,Role role){ 

    this.ename=ename; 
    this.enumber=enumber; 
    this.role=role; 
} 

@Id @GeneratedValue 
@Column(name="id") 
public int getId() { 
    return id; 
} 

public void setId(int id) { 
    this.id = id; 
} 

public String getEname() { 
    return ename; 
} 

public void setEname(String ename) { 
    this.ename = ename; 
} 

public String getEnumber() { 
    return enumber; 
} 

public void setEnumber(String enumber) { 
    this.enumber = enumber; 
} 

@OneToOne(cascade = CascadeType.ALL) 
@JoinColumn(name = "role_id") 
public Role getRole() { 
    return role; 
} 

public void setRole(Role role) { 
    this.role = role; 
} 



@OneToMany(cascade=CascadeType.ALL) 
@JoinTable(
     name="employee_task", 
     [email protected]inColumn(name="eid"), 
     [email protected](name="tid") 
) 
public Collection<Task> getTask() { 
    return task; 
} 

public void setTask(Collection<Task> task) { 
    this.task = task; 
}} 

角色实体

@Entity(name="role") 
public class Role implements Serializable{ 


@Id @GeneratedValue 
@Column(name="id") 
private int id; 

private String title; 
private String description; 


public int getId() { 
    return id; 
} 

public void setId(int id) { 
    this.id = id; 
} 

public String getTitle() { 
    return title; 
} 

public void setTitle(String title) { 
    this.title = title; 
} 

public String getDescription() { 
    return description; 
} 

public void setDescription(String description) { 
    this.description = description; 
} 


} 

堆栈跟踪

Info: Hibernate: select role0_.id as id1_2_, role0_.description as descript2_2_, role0_.title as title3_2_ from role role0_ 
Info: Hibernate: select task0_.id as id1_3_, task0_.tname as tname2_3_ from task task0_ 
Info: Hibernate: select employee0_.id as col_0_0_ from employee_profile employee0_ inner join role role1_ on employee0_.role_id=role1_.id 
Info: Hibernate: select e.id as eid , r.id as rid , e.ename , e.enumber , r.description from employee_profile e INNER JOIN role r ON (e.role_id = r.id) 
Info: Hibernate: select role0_.id as id1_2_, role0_.description as descript2_2_, role0_.title as title3_2_ from role role0_ 
Info: Hibernate: select task0_.id as id1_3_, task0_.tname as tname2_3_ from task task0_ 
Warning: Servlet.service() for servlet jsp threw exception 
java.lang.NumberFormatException: For input string: "id" 
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) 
at java.lang.Integer.parseInt(Integer.java:580) 
at java.lang.Integer.parseInt(Integer.java:615) 
at javax.el.ArrayELResolver.toInteger(ArrayELResolver.java:378) 
at javax.el.ArrayELResolver.getValue(ArrayELResolver.java:198) 
at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:188) 
at com.sun.el.parser.AstValue.getValue(AstValue.java:140) 
at com.sun.el.parser.AstValue.getValue(AstValue.java:204) 
at com.sun.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:226) 
at org.apache.jasper.runtime.PageContextImpl.evaluateExpression(PageContextImpl.java:1016) 
at org.apache.jsp.EmployeeView_jsp._jspx_meth_c_forEach_0(EmployeeView_jsp.java:297) 
at org.apache.jsp.EmployeeView_jsp._jspService(EmployeeView_jsp.java:125) 
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:111) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) 
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:411) 
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:473) 
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:377) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) 
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682) 
at org.apache.catalina.core.ApplicationDispatcher.doInvoke(ApplicationDispatcher.java:875) 
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:739) 
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:575) 
at org.apache.catalina.core.ApplicationDispatcher.doDispatch(ApplicationDispatcher.java:546) 
at org.apache.catalina.core.ApplicationDispatcher.dispatch(ApplicationDispatcher.java:428) 
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:378) 
at Controller.EmployeeController.doPost(EmployeeController.java:214) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:707) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) 
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:318) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160) 
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734) 
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673) 
at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174) 
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:416) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:283) 
at com.sun.enterprise.v3.services.impl.ContainerMapper$HttpHandlerCallable.call(ContainerMapper.java:459) 
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:167) 
at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:206) 
at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:180) 
at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:235) 
at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119) 
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:283) 
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:200) 
at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:132) 
at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:111) 
at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77) 
at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:536) 
at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112) 
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117) 
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:56) 
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:137) 
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:591) 
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:571) 
at java.lang.Thread.run(Thread.java:748) 
+1

在某些时候,你的代码试图将字符串' '“id”''为一个数字。看看堆栈跟踪了解更多信息。或者发布。由于我没有在任何地方看到该字符串:数据库中的“id”列可能是一个varchar并且包含值“id”? – f1sh

+0

@ f1sh我已经更新了堆栈跟踪,“id”是整数而不是varchar。 – progman

+0

你可以请用“Integer”而不是int来尝试。 – shivam

回答

0

你能修改你的Dao类吗?

SQLQuery query = session.createSQLQuery("select e.id as eid , r.id as rid , e.ename , e.enumber , r.description from employee_profile e INNER JOIN role r ON (e.role_id = r.id)"); 

List <Object []> rows =query.list(); 
List <Employee> employee_role = new ArralList<>(); 
for(Object[] row : rows){ 
    Employee emp = new Employee(); 
    Role role = new Role(); 

    emp.setId(Integer.parseInteger(row[0].toString())); 
    role.setId(Integer.parseInteger(row[1].toString())); 
    emp.setEname(row[2].toString()); 
    emp.setEnumber(row[3].toString())); 
    role.setDescription(row[4].toString())); 
    emp.setRole(role); 


    employee_role.add(emp); 
    } 
return employee_role; 

名单()”的SQLQuery类的方法 - 将始终返回,你需要类型转换为Employee对象的对象列表。 这是代码中缺少的内容。

考虑,对于角色属性,如去掉,说明 - 可以请您修改您的EL像{emp.role.description}和同为rid`

+0

请让我知道它的工作与否。 – shivam

+0

感谢您的支持。但是我收到错误“javax.el.PropertyNotFoundException:类'entity.Employee'没有属性'description'。” – progman

+0

正如您可以在您的员工Pojo类中看到的那样,没有称为description的属性。 “描述”在Role Pojo类中。 – shivam

-2

你有Entites - 角色和员工,但这不是你传递给你的View。你传递你从你写的hql获得的List。每个对象都有属性eid,rid,ename,enumber,description。

所以修改代码以:

<td> ${emp.eid} </td> 

而且我打赌它会工作。你感到困惑的是你有实体,你试图访问他们的属性。但是当你做HQL加入时,如果你选择“from employee”,但是你得到一个结果Object [],你就不会得到正常的实体。

另请尝试按照Java标准编写代码。例如,使用camelCase作为方法并且没有下划线;)

+0

谢谢你通知我。但我得到相同的错误 “java.lang.NumberFormatException:对于输入字符串:”eid“” – progman

+0

所以你注意到查询不返回实体列表,而是一个“Object []''列表和你打赌把''emp.id''改成''emp.eid''会起作用吗? – f1sh

0

在SQL查询结果中的每一行是一个数组,你可以在你的声明看:

List <Object []> employee_role =query.list(); 

在您的jsp中,您尝试使用您没有的属性名称来访问每个数组的内容。相反,你有数组,这意味着你必须使用索引访问内容。试试:

<td> ${emp[0]} </td> 
<td> ${emp[1]} </td> 

等等。

该异常是由EL评估程序(请参阅stacktrace:javax.el.ArrayELResolver.getValue)导致的,该尝试将emp数组的索引中的属性名称试图将其转换为Tnteger。当然,这不适用于字符串"id"

+0

@flsh我收到错误“javax.el.PropertyNotFoundException:类'java.lang.Integer'没有属性'id'。 – progman

+0

听起来像你把它改成''{{emp [0]。不要那样做。 – f1sh

0

根据SQLQuery的文档。列表中的值是Object []数组。你可以试试emp [0]的id值,同样对于ename-emp [2],enumber-emp [3],description-emp [4]

相关问题