【发布时间】: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 或任何转发器之前进行这样的测试。
【问题讨论】: