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

标签 mysql sql hibernate join named-query

我有 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

@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 |
+---------+---------+

关于mysql - Hibernate 命名查询 - 连接 3 个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8399379/

相关文章:

mysql - 什么 MySQL 表设计在性能上更好?

如果列不存在,MYSQL如何更改表

mysql - 在 MySQL 中合并两个结果集

mysql - 获取MYSQL中每个组的Top记录

mysql - 在 RDBMS 中存储 uni/bi/trigrams ngrams 的正确方法?

java - 没有 Spring,Hibernate 有意义吗?

mysql - 如何从 rails env 检查 mysql 数据库存在的位置?

sql - 是否可以创建一个了解当前模式/库名称的 View ?

java - 为什么 Hibernate ALTER 是我的 QUERY ?带有 IN 运算符的多列

json - 具有 ManyToOne 关系的 JPA 实体 JSON 序列化