Mysql Hibernate命名查询-连接3个表

Mysql Hibernate命名查询-连接3个表,mysql,sql,hibernate,join,named-query,Mysql,Sql,Hibernate,Join,Named Query,我有3个bean:组织、角色、用户 角色-组织关系-@ManyToOne 角色-用户关系-@ManyToMany 组织: @实体 @表(name=“实体\组织”) 公共类组织实现了可序列化{ 私有静态最终长serialVersionUID=-646783073824774092L; @身份证 @GeneratedValue(策略=GenerationType.TABLE) 长id; 字符串名; @OneToMany(targetEntity=Role.class,mappedBy=“组织”) 列

我有3个bean:组织、角色、用户

角色-组织关系-@ManyToOne

角色-用户关系-@ManyToMany

组织:

@实体
@表(name=“实体\组织”)
公共类组织实现了可序列化{
私有静态最终长serialVersionUID=-646783073824774092L;
@身份证
@GeneratedValue(策略=GenerationType.TABLE)
长id;
字符串名;
@OneToMany(targetEntity=Role.class,mappedBy=“组织”)
列出角色扮演者;
...
角色:

@实体
@表(name=“实体\角色”)
公共类角色实现可序列化{
私有静态最终长serialVersionUID=-8468851370626652688L;
@身份证
@GeneratedValue(策略=GenerationType.TABLE)
长id;
字符串名;
字符串描述;
@许多酮
组织机构;
...
用户:

@实体
@表(name=“实体\用户”)
公共类用户实现可序列化{
私有静态最终长serialVersionUID=-435385035153638L;
@身份证
@GeneratedValue(策略=GenerationType.TABLE)
长id;
@许多
@JoinTable(name=“实体\用户\角色”,
joinColumns=@JoinColumn(name=“user\u id”,referencedColumnName=“id”),
inverseJoinColumns=@JoinColumn(name=“role\u id”,referencedColumnName=“id”))
列出角色扮演者;
...
因此,我需要获取指定用户的所有组织(首先,我需要选择所有用户角色,然后选择具有此角色的所有组织)

我有一个实现此逻辑的sql语句(例如,我选择id为1的用户):

从实体组织中选择*作为o
内部联接实体\u角色r在r.organization\u id=o.id上
内部连接实体\u用户\u角色ur ON ur.role\u id=r.id
其中ur.user_id=1
如何使用hibernate命名的查询机制实现这一点? 谢谢!

尝试以下HQL:

select ur.roleList.organization from User ur where ur.id = 1 
它将为您提供
列表

@NamedQuery 我在
组织
实体类上创建了以下
@NamedQuery

@NamedQuery(name = "query", query = "SELECT DISTINCT o " +
    "FROM Organization o, User u " +
    "JOIN o.roles oRole " +
    "JOIN u.roles uRole " +
    "WHERE oRole.id = uRole.id AND u.id = :uId")
public class Organization { ...
(我使用标准JPA注释,但我的提供者是Hibernate。)

试验 这是我做的测试

EntityManager em = ...
TypedQuery<Organization> q = em.createNamedQuery("query", Organization.class);
q.setParameter("uId", 1); // try it with 1L if Hibernate barks about it
for (Organization o : q.getResultList())
  System.out.println(o.name);
请看看它是否适合你

桌子 (我用的和你的有点不同,但应该没什么大不了的。)

样本数据
这是“ur.roleList.organization”部分中命名查询语法中的一个错误,因为我认为它不是可用的语法wellError创建文件中定义的名为“accountDaoImpl”的bean时出错原因:org.hibernate.HibernateException:命名查询中的错误:Organization.FindOrganizationsBySerit不工作。id=2的用户具有id=1的角色,因此他必须仅在组织id=1中,但查询返回2rows@BraginiNI我很草率,只检查了查询的结果t代表
uId=1
。很抱歉。我已经更新了我的答案。对于ID:1、2和3,它返回:A和B、B以及A和B。如果没有不同的关键字,将返回重复结果。有人能澄清一下,我们是如何从Organization类中知道o.roles值的,因为它只有roleList属性。
A
B
CREATE TABLE `organization` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`id`)
);

CREATE TABLE `role` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `description` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `organization_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
);

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`)
);

CREATE TABLE `user_has_role` (
  `user_id` int(11) NOT NULL DEFAULT '0',
  `role_id` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`user_id`,`role_id`)
);

ALTER TABLE `role` ADD CONSTRAINT `cst_organization_id` 
  FOREIGN KEY `fk_organiztaion_id` (`organization_id`)
    REFERENCES `organization` (`id`);
`organization`
+----+------+
| id | name |
+----+------+
|  1 | A    |
|  2 | B    |
+----+------+

`role`
+----+------+-------------+-----------------+
| id | name | description | organization_id |
+----+------+-------------+-----------------+
|  1 | A    | a           |               1 |
|  2 | B    | b           |               1 |
|  3 | C    | c           |               2 |
+----+------+-------------+-----------------+

`user`
+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
+----+

`user_has_role`
+---------+---------+
| user_id | role_id |
+---------+---------+
|       1 |       1 |
|       1 |       2 |
|       1 |       3 |
|       2 |       1 |
|       3 |       1 |
|       3 |       3 |
+---------+---------+