[Ljava.lang.Object;无法强制转换为project.model.Role

[Ljava.lang.Object;无法强制转换为project.model.Role,java,hibernate,Java,Hibernate,我试图使用联接值从表中显示角色名称及其id 应该发生的是: 用户登录时,用户的id保存在变量中 我们查询联接表“user_roles”以获得用户拥有的角色列表,联接表有两个键:“iduser”和“idrole”,它们都是用户表和角色表的外键 然后,我需要按角色名称(在角色列表中)显示该角色,这将为我提供: java.lang.ClassCastException:[Ljava.lang.Object;无法强制转换为prj.model.Role javax.faces.FacesExceptio

我试图使用联接值从表中显示角色名称及其id

应该发生的是:

  • 用户登录时,用户的id保存在变量中

  • 我们查询联接表“user_roles”以获得用户拥有的角色列表,联接表有两个键:“iduser”和“idrole”,它们都是用户表和角色表的外键

  • 然后,我需要按角色名称(在角色列表中)显示该角色,这将为我提供:

    java.lang.ClassCastException:[Ljava.lang.Object;无法强制转换为prj.model.Role javax.faces.FacesException:#{userloginMB.login}:java.lang.ClassCastException:[Ljava.lang.Object;无法强制转换为prj.model.Role

我的角色文件如下:

import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinTable;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.Table;



@Entity
@Table(name="ROLES") 
public class Role {



    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int idrole;


        public int getIdrole() {
        return idrole;
    }

    public void setIdrole(int idrole) {
        this.idrole = idrole;
    }

    public String getRole() {
        return role;
    }

    public void setRole(String role) {
        this.role = role;
    }

    private String role; 
}
我的问题是这样的:

    public List<Role[]> getRolesByUserId(int iduser) {
//Query query = getSessionFactory().getCurrentSession().createQuery("from Role r INNER JOIN r.userRoles a where a.iduser  = :Iduser").setParameter("Iduser", iduser);
List<Role[]> list = (List<Role[]>) getSessionFactory().getCurrentSession().createSQLQuery("SELECT * FROM roles WHERE idrole IN (SELECT idrole FROM User_Roles WHERE iduser = :Iduser)").setParameter("Iduser", iduser).list();

return list;
}

注意:我手动知道该表有两个条目指向该用户,这就是为什么我在创建foreach或任何repeater之前要进行这样的测试。

问题是,您使用的是本机SQL查询,它将返回“原始”值

要使hibernate为您提供
角色
类,您可以这样设置实体类型

createSQLQuery("SELECT * FROM roles WHERE idrole IN (SELECT idrole FROM User_Roles WHERE iduser = :Iduser)").setParameter("Iduser", iduser).addEntity(Role.class).list();

为了进一步参考,请查看文档

事实上,除了kucing_terbang所说的,您必须将更改为,因为您将获得角色列表,而不是角色类型的组合对象列表,并尝试以下操作:

                System.out.println(getUserRoles().get(0).getIdrole());
                System.out.println(getUserRoles().get(0).getRole());

(然后,您可以使用for boucle或foreach显示所有数据…

我仍然得到以下信息:project.model.Role不能转换为[Lproject.model.Role;
createSQLQuery("SELECT * FROM roles WHERE idrole IN (SELECT idrole FROM User_Roles WHERE iduser = :Iduser)").setParameter("Iduser", iduser).addEntity(Role.class).list();
                System.out.println(getUserRoles().get(0).getIdrole());
                System.out.println(getUserRoles().get(0).getRole());