java.lang.ClassCastException:[Ljava.lang.Object;无法转换为rmc.entity.UserEntity

时间:2016-07-02 17:33:49

标签: java hibernate

我创建了一个数据库访问对象(DAO)类,实体类和表脚本,但是我收到的错误无法映射到实体。
我正在使用hibernate框架,并且与数据库正确连接,但仍然发生错误。请检查下面的代码并以任何方式提供帮助,所有文件都在下面提供。

表脚本

DROP TABLE rmc_user;
CREATE TABLE rmc_user(
user_id VARCHAR(50) NOT NULL,
user_name VARCHAR(20) NOT NULL,
user_email VARCHAR(50) NOT NULL,
user_password VARCHAR(20),
CONSTRAINT rmc_user_user_id_pk PRIMARY KEY (user_id),
CONSTRAINT rmc_user_user_email_un UNIQUE (user_email) 
);

INSERT INTO rmc_user VALUES   ('101','yashik','yas@gmail.com','gulati123');

SELECT * FROM rmc_user;

DAO课程

package rmc.dao;

import java.util.List;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.query.Query;
import rmc.bean.User;
import rmc.entity.UserEntity;
import rmc.resources.HibernateUtility;

public class LoginDAOImpl implements LoginDAO {

    @SuppressWarnings("deprecation")
    public User getUserDetails(String userName, String password) {
        SessionFactory sessionFactory = HibernateUtility.createSessionFactory();
        Session session = null;
        User u1 = null;
        session = sessionFactory.openSession();
        session.beginTransaction();
        System.out.println("begin trx");
        Query q1 = session
                .createNativeQuery("select * from rmc_user where user_name=?");
        System.out.println("begin trx");
        q1.setParameter(0, userName);
        System.out.println("begin trx");
        @SuppressWarnings("unchecked")
        List<UserEntity> l1 = q1.list();
        System.out.println("begin trx");
        System.out.println("size is"+l1.size());
        if (l1.size() == 0) {
            System.out.println("no Such user Exist");
        } else if (!(l1.get(0).getPassword().equals(password))) {
            System.out.println("Invalid Password");
        }
        System.out.println("begin trx");
        u1 = new User();
        u1.setEmail(l1.get(0).getEmail());
        u1.setPassword(l1.get(0).getPassword());
        u1.setUserId(l1.get(0).getUserId());
        u1.setUserName(l1.get(0).getUserName());
        session.getTransaction().commit();
        if (session != null) {
            session.close();
        }
        return u1;
    }
}

实体类

package rmc.entity;
@Id
@Column(name="user_id")
private String userId;
@Column(name="user_name")
private String userName;
@Column(name="user_email")
private String email;
@Column(name="user_password")
private String password;

//getter and setter 
}

错误消息

Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to rmc.entity.UserEntity
at rmc.dao.LoginDAOImpl.getUserDetails(LoginDAOImpl.java:32)
at rmc.test.UserInterface.main(UserInterface.java:9)

已更新

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration SYSTEM 
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
<session-factory>
    <property name="hibernate.dialect">
        org.hibernate.dialect.MySQLDialect
    </property>
    <property name="hibernate.connection.driver_class">
        com.mysql.jdbc.Driver
    </property>

    <!-- Assume test is the database name -->
    <property name="hibernate.connection.url">
        jdbc:mysql://localhost:3306/rmc
    </property>
    <property name="hibernate.connection.username">
        ******
    </property>
    <property name="hibernate.connection.password">
        ******
    </property>


    <!-- List of XML mapping files -->
    <mapping class="rmc.entity.UserEntity"/>

</session-factory>

2 个答案:

答案 0 :(得分:1)

如果您的结果行与UserEntity兼容,则以下修改可能会解决您的问题:

Query q1 = session
        .createNativeQuery("select * from rmc_user where user_name=?", UserEntity.class);

答案 1 :(得分:0)

问题可能就在这里

Query q1 = session.createNativeQuery("select * from rmc_user where user_name=?");

当您执行此查询时,因为它是一个SQL查询,q1.list()的返回列表将具有以下格式:Object [] {row1col1,row1col2,row1,col3,row2col1,...就是它传播列,它没有将行映射到实体(UserEntity)。

它没有映射,因为它不是HQL,也不是JPQL,本机SQL和SQL不了解您的实体。

你应该这样做:

Query q1=session.createQuery("select * from UserEntity where user_name=?");

这是HQL,这个Hibernate会将每一行映射到实体,因此q1.list()的返回列表现在将具有格式:UserEntity [] {entity1,entity2,...}。

我希望能解决你的问题。