【问题标题】:[Ljava.lang.Object; cannot be cast to project.model.Role[Ljava.lang.Object;无法转换为 project.model.Role
【发布时间】:2015-12-18 17:45:14
【问题描述】:

我正在尝试显示一个角色名称,它是使用连接值的表中的 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;
}

托管 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 或任何转发器之前进行这样的测试。

【问题讨论】:

    标签: java hibernate


    【解决方案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

    【讨论】:

    • 我仍然得到这个:project.model.Role 不能转换为 [Lproject.model.Role;
    【解决方案2】:

    事实上,除了 kucing_terbang 所说的,你必须将 更改为,因为你得到一个角色列表而不是角色类型的组合对象列表,然后试试这个:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-05
      • 2013-09-14
      • 1970-01-01
      • 1970-01-01
      • 2014-07-08
      • 2012-08-07
      • 1970-01-01
      相关资源
      最近更新 更多