【问题标题】:How to preform JOIN with JPA JAVA如何使用 JPA JAVA 执行 JOIN
【发布时间】:2019-05-27 15:58:57
【问题描述】:


我想简短而清楚地解决我的问题..我正在尝试从执行联接的数据库中检索数据以获得我想要的结果..
所以我有 3 张桌子,

EMPLOYEE:
emp_id -- PK
name..
surname..
dob.. etc

用户:

UserID PK
Username
Pass
emp_id fk
role_id fk

角色

RoleID pk
Description

我想执行一个查询来获得一个员工列表,这些员工是用户,并且 roleid =2; 我如何在 JPA 上做到这一点

我试过了

Select e from Employee e JOIN User u Join Role r where r.roleId = 2

但它仍然无法在不过滤 ID=2 的情况下获取所有员工

谢谢大家

【问题讨论】:

  • “但它仍然无法在不过滤 ID=2 的员工的情况下获取所有员工”您忘记了 ON 子句,它接合了您的数据库现在正在执行它作为CROSS JOIN 代替.. 我很想把这个问题投票为一个简单的印刷错误
  • 如果这没有帮助,或者您可以弄清楚。我建议您阅读Why should I provide a Minimal Reproducible Example for a very simple SQL query? 并提供示例数据和预期结果。
  • Select * from Employee e inner join User u on e.emp_id= pr.emp_id inner join Role r on on r.roleID= u.roleId where r.roleID =2 我在 SQL 中试过这个查询,它工作得很好,这就是我试图在 JPA 中检索的内容
  • @RaymondNijland 不,这不是 SQL 查询,但 JPA 查询不一样,我读到您不应该指定 On 子句
  • 在这种情况下,我将问题投票为 “寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及最短的在问题本身中重现它所必需的代码。”

标签: java sql database jpa


【解决方案1】:

您必须设置实体之间的关联,即定义两个实体如何相互链接。这样spring就能将jpql转成sql并获取数据了。

您必须编写您的用户和员工实体,如

public class User {
...
@OneToOne
@JoinColumn //using which column name it should join
private Employee employee;

@ManyToOne
@JoinColumn
private Role role;
...
public class Employee {
...
@OneToOne(mapedBy="employee")
private User user;
...

然后你可以像这样写你的查询

@Query("select e from Employee e LEFT JOIN e.user u LEFT JOIN u.role r where r.id = :roleId")
List<Employee> getEmployeeListByRoleId(@Param("roleId") Long roleId); 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-19
    • 2011-06-12
    • 1970-01-01
    • 1970-01-01
    • 2019-07-17
    • 2010-10-01
    • 1970-01-01
    相关资源
    最近更新 更多