我创建了一个数据库访问对象(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>
答案 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,...}。
我希望能解决你的问题。