我正在尝试使用连接值显示角色名称和来自表格的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或任何转发器之前进行此类测试的原因。
答案 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来显示所有数据......)