[Ljava.lang.Object;无法强制转换为project.model.Role
我试图使用联接值从表中显示角色名称及其id 应该发生的是:[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保存在变量中
- 我们查询联接表“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());