我想检索许多共同具有“角色”的“访问”。
这是命名查询:
SELECT access
FROM Access AS access
WHERE :role MEMBER OF access.listRole
访问实体
public class Access implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
private String name;
private String libelle;
@ManyToOne
private Module oneModule;
@ManyToMany
private List<Role> listRole;
/* Setter & Getter */
}
角色实体
public class Role implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
private String name;
private String description;
@Enumerated(EnumType.STRING)
private Flag oneFlag;
@Transient
private int lengthAccess;
@OneToMany(mappedBy="oneRole")
private List<UserAccount> listUserAccount;
@ManyToMany
private List<Access> listAccess;
/* Geter & Setter */
}
但我没有做到正确的EJB-QL!
配置:
感谢。
答案 0 :(得分:0)
我无法重现这个问题。运行您提供的JPQL查询时,如下所示:
String qlString = "SELECT access " +
"FROM Access AS access " +
"WHERE :role MEMBER OF access.listRole";
Role role = new Role();
role.setId(1L);
List accesses = session.createQuery(qlString).setParameter("role", role).list();
Hibernate为我生成以下SQL查询(我通过删除一些属性简化了你的实体):
select
access0_.id as id127_,
access0_.libelle as libelle127_,
access0_.name as name127_
from
Access access0_
where
? in (
select
role2_.id
from
Access_ROLES listrole1_,
ROLES role2_
where
access0_.id=listrole1_.Access_id
and listrole1_.listRole_id=role2_.id
)
一切似乎都正确(使用Hibernate Core 3.3.0.SP1,Hibernate Annotations 3.4.0.GA,Hibernate EM 3.4.0.GA进行测试)
您使用的是什么版本的Hibernate(Core,Annotations,EntityManager)?你到底有什么错误?你能说明你如何调用查询吗?
答案 1 :(得分:0)
我的两个类之间的链接@ManyToMany没有以正确的方式编写,在项目构建期间,2个表在MySQL中创建(“access_role”用于我的链接@ManyToMany在'access'类中,而role_access用于我的链接@ManyToMany在'角色'类中)
所以,为了纠正这个问题,我修改了这个
public class Access implements Serializable {
// ...
@ManyToMany(mappedBy="listAccess")
private List<Role> listRole;
// ...
}
public class Role implements Serializable {
// ...
@ManyToMany
@JoinTable(name = "access_role",
joinColumns = @JoinColumn(name = "role_id", referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(name = "access_id", referencedColumnName = "id"))
private List<Access> listAccess;
// ...
}