我有3个bean:组织,角色,用户
角色-组织关系-@ManyToOne
角色-用户关系-@ManyToMany
组织机构:
@Entity @Table(name = "entity_organization") public class Organization implements Serializable { private static final long serialVersionUID = -646783073824774092L; @Id @GeneratedValue(strategy = GenerationType.TABLE) Long id; String name; @OneToMany(targetEntity = Role.class, mappedBy = "organization") List<Role> roleList; ...
角色:
@Entity @Table(name = "entity_role") public class Role implements Serializable { private static final long serialVersionUID = -8468851370626652688L; @Id @GeneratedValue(strategy = GenerationType.TABLE) Long id; String name; String description; @ManyToOne Organization organization; ...
用户名:
@Entity @Table(name = "entity_user") public class User implements Serializable { private static final long serialVersionUID = -4353850485035153638L; @Id @GeneratedValue(strategy = GenerationType.TABLE) Long id; @ManyToMany @JoinTable(name = "entity_user_role", joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "role_id", referencedColumnName = "id")) List<Role> roleList; ...
因此,我需要获取指定用户的所有组织(首先,我需要选择所有用户角色,然后选择具有此角色的所有组织)
我有一个实现此逻辑的sql语句(例如,我选择id = 1的用户):
SELECT * FROM entity_organization AS o INNER JOIN entity_role r ON r.organization_id = o.id INNER JOIN entity_user_role ur ON ur.role_id=r.id WHERE ur.user_id = 1
如何使用hibernate命名查询机制实现此目的?谢谢!
我@NamedQuery在Organization实体类上创建了以下内容。
@NamedQuery
Organization
@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);
使用下面的表和样本数据,此输出
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 | +---------+---------+