【问题标题】:Hibernate multiple table join休眠多表连接
【发布时间】:2017-09-12 11:26:16
【问题描述】:

我有以下表格

User (has FK_RoleKey) -> UserRole (Role Key)
UserRoleResourceAccess(FK_RoleKey) -> UserRole(RoleKey)
UserRoleResourceAccess (has FK_ResourceKey) -> Resource (ResourceKey Key)

例如行:

User-> EmailId = user@abc.com  | FK_RoleKey = 1
UserRole -> Role Key=1| RoleName= Admin
Resource -> Resource Key=1 | Resource name= "page1"
UserRoleResourceAccess -> FK_RoleKey =1 |FK_ResourceKey = 1

如何使用休眠条件查询获取给定用户的所有用户权限(角色和资源)。

简而言之:这是我试图在单个休眠查询中实现的目标

select * from User user 
LEFT JOIN UserRole userRole 
ON user.`FK_RoleKey` = userRole.`RoleKey`
LEFT JOIN UserRoleResourceAccess userRoleResourceAccess 
ON userRoleResourceAccess.`FK_RoleKey` = userRole.`RoleKey`
LEFT JOIN `Resource` resource 
ON resource.`ResourceKey` = userRoleResourceAccess.`FK_ResourceKey`
 where user.`EmailID` = 'abc';

【问题讨论】:

    标签: java mysql hibernate


    【解决方案1】:

    根据您的示例,假设电子邮件是用户表上的 PK,那么您只需使用 HQL 从表中获取用户。

     String hql = "FROM User WHERE email = '"+email+"'";<br>
     TypedQuery<User> query = sessionFactory.getCurrentSession().createQuery(hql);<br>
     User user = query.getSingleResult();
    

    如果您的映射正确,Hibernate 会自动检索其他外键数据并将其存储给 User。要找回它们,您可以使用...

    String role = user.getUserRole().getRoleName();
    

    同样适用于资源。希望这会有所帮助。

    【讨论】:

    • 但是我必须编写另一个查询来获取与 UserRoleResourceAccess 中存在的角色相关的所有资源。
    • 能否添加用户表实体的代码...您是否使用@OnetoOne 和@JoinColumn 正确地将UserRoleResourceAccess 映射到用户表?如果是,上述 SQL 应该可以工作,您可以像我所说的那样检索数据......
    • 不,我没有..检查原始问题中的列表。用户表有用户角色用户角色表的外键,资源表只有主键没有外键。 UserRoleResourceAccess 具有用于 UserRole 的 FK 和用于 Resource 表的 FK
    • stackoverflow.com/questions/21762328/…检查这个问题,这会对你有所帮助。
    猜你喜欢
    • 1970-01-01
    • 2016-09-07
    • 2016-04-20
    • 1970-01-01
    • 2013-04-20
    • 1970-01-01
    • 2015-09-27
    • 2016-09-20
    相关资源
    最近更新 更多