我正在运行数据库查询并尝试将结果转换为Customer对象,但我收到错误消息:
java.lang.ClassCastException: Entities.Customer cannot be cast to Entities.Customer
我的代码:
Customer c = (Customer)em.createNamedQuery("Customer.findByEmail")
.setParameter("email", user)
.getSingleResult();
我读过这是因为类加载器,但说实话,这有点过头了。在其他地方是否有一个巨大的问题,或者我只是错误地投了它?
答案 0 :(得分:1)
看起来你有两个ClassLoaders。您可以使用
检查类加载器Customer.class.getClassLoader();
em.createNamedQuery("Customer.findByEmail").setParameter("email", user).getSingleResult().getClass().getClassLoader();
然后您可以尝试查找更多信息。
答案 1 :(得分:0)
如果您有选择,我建议您使用JPA 2.0并使用:
<T> TypedQuery<T> createNamedQuery(java.lang.String name,
java.lang.Class<T> resultClass)
我认为它应该避免类强制转换异常。
答案 2 :(得分:0)
就像allprog所说的那样,因为给你回复的类来自与你的webapp不同的jar(我假设你正在使用webapp)。
在运行时,来自一个jar(或您的应用程序)的类加载器加载的Customer将从另一个jar(或app)转换为客户。
如此不同的可能性:
在这两种情况下,您都会遇到同样的错误。
您可以尝试使用javap反编译您的类,看看会发生什么。
如果您想了解更多关于classLoading的信息: http://zeroturnaround.com/rebellabs/video-do-you-really-get-class-loaders-a-jazoon-talk-by-jevgeni-kabanov/