【问题标题】:Error: java.lang.ClassCastException错误:java.lang.ClassCastException
【发布时间】:2011-06-06 12:03:23
【问题描述】:

更新整个帖子。

public Login authenticate(Login login) {
        String query = "SELECT 1 FROM Login AS l WHERE l.email=? AND l.password=?";
        Object[] parameters = { login.getEmail(), login.getPassword() };
        List resultsList = getHibernateTemplate().find(query,parameters);
        if ( resultsList.size() == 1 ) {
        results = (Login)resultsList.get(0);
        System.out.println(results);
        } else {
            System.out.println("Error dude.... ");
        // error no entity or mutiple entities
        }
        return results;
}

我现在返回登录对象。

private void checkLogin() {
        form.commit();

        Login newUser = new Login();
        newUser = ilogin.authenticate(loginbean);
        System.out.println("Its Null Value" + newUser);
        if (newUser == null) {
            getWindow().showNotification("Login failed", LOGIN_ERROR_MSG,
                    Notification.TYPE_WARNING_MESSAGE);
        } else {
            System.out.println(newUser);
            getApplication().setUser(newUser);
        }
    }

当没有匹配的电子邮件时,我得到没有这样的用户,并且此语句确实会打印出来。 System.out.println("Its Null Value" + newUser);

但是当有电子邮件和密码匹配时。我得到奇怪的错误。

原因:java.lang.ClassCastException: java.lang.Integer 不能转换为 com.intermedix.domain.Login 在 com.vaadin.event.ListenerMethod.receiveEvent(ListenerMethod.java:507) 在 com.vaadin.event.EventRouter.fireEvent(EventRouter.java:161) 在 com.vaadin.ui.AbstractComponent.fireEvent(AbstractComponent.java:1154) 在 com.vaadin.ui.Button.fireClick(Button.java:371) 在 com.vaadin.ui.Button.changeVariables(Button.java:193) 在 com.vaadin.terminal.gwt.server.AbstractCommunicationManager.handleVariables(AbstractCommunicationManager.java:1094) 在 com.vaadin.terminal.gwt.server.AbstractCommunicationManager.doHandleUidlRequest(AbstractCommunicationManager.java:590) 在 com.vaadin.terminal.gwt.server.CommunicationManager.handleUidlRequest(CommunicationManager.java:266) 在 com.vaadin.terminal.gwt.server.AbstractApplicationServlet.service(AbstractApplicationServlet.java:476) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:820) 在 org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511) 在 org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:390) 在 org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) 在 org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182) 在 org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765) 在 org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418) 在 org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:230) 在 org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114) 在 org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 在 org.mortbay.jetty.Server.handle(Server.java:326) 在 org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542) 在 org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:943) 在 org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:756) 在 org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218) 在 org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) 在 org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:410) 在 org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582) 造成的: java.lang.ClassCastException: java.lang.Integer 不能转换为 com.intermedix.domain.Login 在 com.intermedix.services.LoginService.authenticate(LoginService.java:31) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native 方法) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 在 java.lang.reflect.Method.invoke(Method.java:597) 在 org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:301) 在 org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182) 在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149) 在 org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106) 在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) 在 org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204) 在 $Proxy32.authenticate(未知来源) 在 com.intermedix.ui.LoginDailog.checkLogin(LoginDailog.java:106) 在 com.intermedix.ui.LoginDailog.access$0(LoginDailog.java:102) 在 com.intermedix.ui.LoginDailog$1.buttonClick(LoginDailog.java:52) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native 方法) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 在 java.lang.reflect.Method.invoke(Method.java:597) 在 com.vaadin.event.ListenerMethod.receiveEvent(ListenerMethod.java:487) ... 26 更多

更新

我的登录 bean 类

package com.intermedix.domain;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="users")
public class Login {
      public Login(){}
        private Long id = null;
        private String email;
        private String password;

        public Login(String email, String password)
        {
            this.email = email;
            this.password = password;
        }

        @Id
        @GeneratedValue(strategy=GenerationType.AUTO)
        public Long getId() {
            return id;
        }

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

        public String getPassword() {
            return password;
        }

        public void setPassword(String password) {
            this.password = password;
        }

        public String getEmail() {
            return email;
        }

        public void setEmail(String email) {
            this.email = email;

        }
}

我也根据 raplh 查询进行了更新。

【问题讨论】:

  • 你试图只获取两个属性并在整个 obj 中进行强制转换
  • 你能告诉我要编辑什么
  • LoginService.authenticate 第 32 行是什么样的?
  • 更新了全班
  • 什么是 ILogin,它扩展了什么?在两行之间阅读,我假设您应该返回一个不同的对象,而不是选择中的电子邮件和 id。我假设有一个可以返回的对象,它实际上实现了 ILogin,因此可以转换为 LoginService。

标签: java hibernate spring


【解决方案1】:

根据您的问题org.hibernate.hql.ast.QuerySyntaxException,我强烈假设 Login 是一个映射对象。

在这种情况下,如果你以正确的方式使用Hibernate,你不需要手动做查询结果和对象之间的映射:

已更正(我忘记了查询的“AS l”部分)

   List results = createQuery(
     "SELECT l FROM login AS l WHERE l.email=:email AND l.password=:password")
     .setParameter("email",login.getEmail())
     .setParameter("password",login.getPassword()).list();
   if (results.isEmpty()) {
     //.. login failed
   } else if (result.size() > 1) {
     throw new SomethingWrongException();
   } else {
     Login login = (Login) results.get(0);
   }

【讨论】:

  • 当然你可以通过不加载对象来优化查询,而只计算匹配的实体:0 == 登录失败,1 == 通过,>= 2 == 你应该使用唯一约束
  • @theJava -- 我不明白? ——现在有效了吗? -- 你需要: String query = "FROM Login WHERE email=? AND password=?";
  • 这一行有多个标记 - 未为 LoginService 类型定义方法 createQuery(String) - List 是原始类型。对泛型类型 List 的引用应该被参数化
【解决方案2】:

尝试替换这个:

 return (LoginService) results.get(0);

用这个:

 return (Login) results.get(0);

假设 Login 是一个正确映射的休眠实体,它应该可以工作。

你也应该改变这一行

String query = "SELECT 1 FROM Login AS l WHERE l.email=? AND l.password=?";

String query = "SELECT login FROM Login AS login WHERE login.email=? AND login.password=?";

还请记住,@Ralph 的建议对于如何参数化查询是一个非常好的建议。你应该这样做。

【讨论】:

    【解决方案3】:

    您更新的问题:

    更新您的查询:

    String query = "SELECT l FROM Login AS l WHERE l.email=? AND l.password=?";
    

    请阅读手册: http://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html

    【讨论】:

    • 引起:java.lang.ClassCastException:java.lang.Integer 无法转换为 com.intermedix.domain.Login 更新您的代码后出现此错误
    • 请发布完整的堆栈跟踪,并标记发生异常的行。
    【解决方案4】:

    当你执行类似

    的查询时

    SELECT email, id FROM Login WHERE email=? AND 密码=?

    您要求 Hibernate 为您提供来自 Login 实体的特定属性 emailid。然后 Hibernate 会将结果作为数组列表提供给您,每个列表项代表 [email, id] 数组。

    如果您只想查询所有符合您条件的Login 实体,请执行以下操作:

    FROM Login WHERE email=? AND 密码=?

    然后您的结果列表将包含Login 对象。

    但至于你为什么要投到LoginService,我不知道。您混淆了许多不同的 Hibernate 概念并试图将它们混合在一起。

    我的意思并不是听起来毫无帮助,但我认为您确实需要正确阅读 Hibernate 文档,并更好地掌握您在做什么。

    【讨论】:

      猜你喜欢
      • 2019-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多