kai*_*kai 2 java jpa eclipselink
public Long getId()
{
Some code ...
TypedQuery<Long> query = entityManager.createQuery(sQuery, Long.class);
return query.getSingleResult();
}
Run Code Online (Sandbox Code Playgroud)
从这个代码,我收到了ClassCastException从Integer到Long.我检查query.getSingleResult();了调试器并且我认可了Integer5.
如果我将代码更改为query.getSingleResult().longValue();它仍然无法正常工作.我得到了同样的例外.但如果我使用
Number tmp = query.getSingleResult();
return tmp.longValue();
Run Code Online (Sandbox Code Playgroud)
有用.我的问题是为什么第一个解决方案不起作用?Surley我可以改变我的查询,但我只想知道为什么secound有效而第一个没有.
随意更改我的问题的标题.提前致谢!
您的查询实际上返回了一个,Integer但您假装它Long通过调用返回a entityManager.createQuery(sQuery, Long.class).
现在当你执行
query.getSingleResult()
query.getSingleResult().longValue()
Run Code Online (Sandbox Code Playgroud)
由于您的泛型声明,编译器会将强制转换插入到Long中.因此这实际上是执行的:
(Long)query.getSingleResult()
((Long)query.getSingleResult()).longValue()
Run Code Online (Sandbox Code Playgroud)
并且ClassCastException被抛出,因为Integer不是Long.
你打电话的时候
Number tmp = query.getSingleResult();
Run Code Online (Sandbox Code Playgroud)
它实际上执行
Number tmp = (Number)query.getSingleResult();
Run Code Online (Sandbox Code Playgroud)
这个代码成功了,因为Integer是Number.
所以不是longValue()抛出异常而是抛出之前的演员.
| 归档时间: |
|
| 查看次数: |
253 次 |
| 最近记录: |