加入2个实体时,JSP:NumberFormatException

时间:2018-09-24 23:53:48

标签: java spring hibernate jsp

我正在尝试在休眠状态下创建自定义查询,现在我正在使用内部联接。

这是我的代码: 分支存储库:

@Query("select b from Branch b inner join User u ON b.branch_manager = u.id")
List<Branch> findAllBranchInfo();

分支服务:

public List<Branch> getAllBranchInfo();

分支服务Impl:

@Override
public List<Branch> getAllBranchInfo() {
    return (List<Branch>) branchRepository.findAllBranchInfo();
}

分支控制器:

@RequestMapping(value="/BranchTest", method=RequestMethod.GET)
public ModelAndView testBranch() {
    ModelAndView model = new ModelAndView("test_branch");
    List<Branch> branchList = branchService.getAllBranchInfo();
    model.addObject("branchList",branchList);
    return model;
}

分支模型:

@Entity
@Table(name="branch")
public class Branch {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long branch_id;

@Column(name="branch_name")
private String branch_name;

@Column(name="branch_manager")
private long branch_manager;

public long getBranch_id() {
    return branch_id;
}

public void setBranch_id(long branch_id) {
    this.branch_id = branch_id;
}

public String getBranch_name() {
    return branch_name;
}

public void setBranch_name(String branch_name) {
    this.branch_name = branch_name;
}

public long getBranch_manager() {
    return branch_manager;
}

public void setBranch_manager(long branch_manager) {
    this.branch_manager = branch_manager;
}

@OneToMany(targetEntity=User.class, mappedBy="branch",cascade=CascadeType.ALL, fetch = FetchType.LAZY)
private List<User> user;

public List<User> getUser() {
    return user;
}

public void setUser(List<User> user) {
    this.user = user;
}


}

现在它给了我这个错误:

Hibernate: select branch0_.branch_id as branch_i1_0_, branch0_.branch_manager as branch_m2_0_, branch0_.branch_name as branch_n3_0_ from branch branch0_ inner join user user1_ on (branch0_.branch_manager=user1_.id)
2018-09-25 07:46:04.544 ERROR 1708 --- [nio-8080-exec-1] o.a.c.c.C.[.[localhost].[/].[jsp]        : Servlet.service() for servlet [jsp] threw exception

java.lang.NumberFormatException: For input string: "first_name"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) ~[na:1.8.0_181]
at java.lang.Integer.parseInt(Integer.java:580) ~[na:1.8.0_181]
at java.lang.Integer.parseInt(Integer.java:615) ~[na:1.8.0_181]

在我将其声明为Integer的任何地方都找不到它。

这是我的jsp:

<c:forEach items="${branchList }" var="branch">
    <tr>
        <td>${branch.branch_name}</td>
        <td>${branch.user.first_name}</td>
    </tr>
</c:forEach>

每次我输入“ $ {branch.user.branch_id}”都会给我一个错误。请帮我。非常感谢!

3 个答案:

答案 0 :(得分:2)

问题是一个分支有很多用户。 branch.user是指用户列表,而不是一个用户。您应该为每个用户重复检索其名字。

1。将混乱的方法getUser()重命名为getUsers(),以更好地突出一对多关系。

2。这是修复您的JSP的尝试:

<c:forEach items="${branchList }" var="branch">
    <tr>
        <td>${branch.branch_name}</td>
        <c:forEach items="${branch.users}" var="user">
            <td>${user.first_name}</td>
        </c:forEach>         
    </tr>
</c:forEach>

我猜是 {users.<n>},其中<n>是整数,指的是用户列表中的第n个元素。这就是为什么当您使用first_name之类的表达式时,JSP处理器会尝试将{users.first_name}转换为整数的原因

答案 1 :(得分:0)

推荐的标准方法是将df.merge(df2, 'left') id 0 1 2 3 4 5 6 7 8 ... 30 31 32 33 34 35 36 37 38 39 0 b 40 41 42 43 44 45 46 47 48 ... 70 71 72 73 74 75 76 77 78 79 1 c 80 81 82 83 84 85 86 87 88 ... 110 111 112 113 114 115 116 117 118 119 2 a 0 1 2 3 4 5 6 7 8 ... 30 31 32 33 34 35 36 37 38 39 3 f 200 201 202 203 204 205 206 207 208 ... 230 231 232 233 234 235 236 237 238 239 4 e 160 161 162 163 164 165 166 167 168 ... 190 191 192 193 194 195 196 197 198 199 5 d 120 121 122 123 124 125 126 127 128 ... 150 151 152 153 154 155 156 157 158 159 更改为long。看到jpa-entity-id-long-or-long知道为什么吗?

并检查相关字段的现有数据库值及其类型。

如果以上问题仍不能解决问题,则有时由于数据不兼容而删除数据库并从头开始创建数据库。

答案 2 :(得分:0)

在我看来,如果您想在jsp中执行此类操作,您应该在“分支”模型和“用户”模型中执行类似的操作吗?

...
@JoinColumn(name = "branch_manager", referencedColumnName = "branch_manager")
@OneToOne(cascade = CascadeType.ALL, mappedBy = "User", fetch = FetchType.LAZY)
private User branch_manager;
...

与您的“用户”模型类似
然后在您的“分支存储库”中添加JpaRepository,我认为您甚至不需要使用此方法,只需使用“分支控制器”中的findAll方法。 而且应该没问题!

希望这会有所帮助,否则我会误解了您的问题:)