2016-07-02 4 views
0

DAO (데이터베이스 액세스 개체) 클래스, 엔티티 클래스 및 테이블 스크립트를 만들었지 만 엔티티에 매핑 할 수없는 오류가 발생합니다.
최대 절전 모드 프레임 워크를 사용하고 있으며 데이터베이스와의 연결이 제대로 이루어졌지만 여전히 오류가 발생합니다. 아래의 코드를 확인하고 가능한 모든 방법으로 도움을 받으십시오. 모든 파일은 아래에 나와 있습니다.java.lang.ClassCastException : [Ljava.lang.Object; rmc.entity.UserEntity로 캐스팅 할 수 없습니다.

표 스크립트

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','[email protected]','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) 

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

그것이 SQL 쿼리이기 때문에 당신이이 쿼리를 실행

q1.list()의 반환 목록이 형식이있을 것이다 문제는 아마 여기에있다

<?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

예외는이 라인에서 발생 않습니다 '목록 L1 = q1.list를();'? – niceman

+0

이 줄에 오류가 없습니다. '} else if (! (l1.get (0) .getPassword(). equals (password))) {' – Yashik

답변

0

업데이트 : 개체 [ ] {row1col1, row1col2, row1, col3, row2col1, ...} 이는 열을 분산 시키므로 엔티티 (UserEntity)에 행을 매핑하지 않습니다.

이것은 HQL이나 JPQL이 아니기 때문에 매핑되지 않습니다. 네이티브 SQL이고 SQL은 엔티티에 대해 알지 못하기 때문에 매핑되지 않습니다.

대신이 작업을 수행해야한다 : 이것은 HQL과 q1.list()의 반환 목록 지금 포맷해야합니다 있도록이 Hibernate는 엔티티에 모든 행을 매핑합니다 함께

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

입니다 : UserEntity [] {entity1, entity2을 ,. ..}.

문제가 해결되기를 바랍니다. 당신의 결과 행이 UserEntity와 호환되는 경우

+0

응답 해 주셔서 감사합니다. 일어나, 제발 좀 봐주실 수 있니? 'org.hibernate.hql.internal.ast.QuerySyntaxException : UserEntity 매핑되지 [? UserEntity FROM u.userName 여기서 U =] ' – Yashik

+0

또한 편집 된' 조회 Q1 = 세션 \t \t \t \t .createQuery ("FROM UserEntity u where u.userName =?"); \t \t q1.setParameter (0, userName); \t \t리스트 l1 = q1.list(); – Yashik

+0

@Yashik @ Yashik은 org의'@ Entity' 주석을 사용할 기회를 얻었습니까?패키지를 최대 절전 모드로 전환 하시겠습니까? 당신은 javax.persistance 패키지에서 오는 것을 사용해야한다. [this] (http://stackoverflow.com/a/8524836/2397162) – niceman

1

다음 수정하여 문제를 해결할 수 있습니다

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