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

时间:2015-09-21 21:57:29

标签: java hibernate

我正在尝试使用连接值显示角色名称和来自表格的id。

应该发生什么:

  • 用户登录,用户ID保存在变量

  • 我们查询连接表“user_roles”以获取用户拥有的角色列表,连接表有两个键:“iduser”和“idrole”,它们都是User表和Role表的外键< / p>

  • 然后我需要通过它的名字(在角色列表上)显示角色,这给了我:

    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;
}

托管bean函数获取角色:

public List<Role[]> getUserRoles() {
    if(userRoles == null){
        userRoles = new ArrayList<Role[]>();
        userRoles.addAll(getRoleService().getRoleByUserId(getIduser()));

    }
    return userRoles;
}

public void setUserRoles(List<Role[]>  userRoles) {
    this.userRoles = userRoles;
}

显示,最后:

            userRoles = getUserRoles();
            for (Role[] role : userRoles){
                System.out.println(role[1].getIdrole());
                System.out.println(role[1].getRole());
            }

注意:我手动知道该表有两个条目给用户,这就是我在创建foreach或任何转发器之前进行此类测试的原因。

2 个答案:

答案 0 :(得分:1)

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

要使hibernate为您提供Role类,您可以像这样设置实体类型。

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

有待进一步参考,请查看文档here

答案 1 :(得分:0)

事实上,除了kucing_terbang所说的内容之外,你必须在获取角色列表而不是类型为Role的组合对象列表时更改为to,并尝试:

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

(然后你可以使用for boucle或foreach来显示所有数据......)