2012-05-15 58 views
0

我有3个表:行动,部门,员工JPQL - 避免使用加入

action (
    id 
    employee_id 
    name 
) 

employee(
    id 
    department_id 
) 

department (
    id 
    name 
) 
  • action.employee_id可以为空

我使用下面的查询:

select a.id, a.name, d.name from action a, employee e, department d where   a.employee_id=e.id and e.department_id=d.id 

但是在没有employee_id的情况下我没有在结果中获得这些行

有没有办法克服这一点,而不使用左连接?


试过到目前为止(没有工作):

select a.id, a.name, d.name from action a, employee e, department d where   (a.employee_id=e.id and e.department_id=d.id) or a.employee_id is null 
+0

它为什么不工作?你看到了什么输出? – Damian

+0

它返回了动作和部门名称的所有组合(对于没有'employee_id'的行)。如果我有x行动,并在所有他们'employee_id'为空,y部门它返回x * y结果,而不是只有x结果 – levtatarov

回答

3

你错过了JPA的整点:具有与其他直接对象相关联,而不是对象持有其他对象ID的对象。

您应该有一个具有ManyToOne关联的Action实体到一个Employee实体,该实体将与Department实体具有ManyToOne关联。 Action中不应该有employeeId字段。员工中不应该有departmentId字段。

这将允许你,例如,通过简单地调用

action.getEmployee().getDepartment().getName() 

得到一个行动的部门名字,你将能够使用左联接在查询中,这将成为

select a.id, a.name, d.name 
from Action a 
left join a.employee e 
left join e.department d 

并会给你预期的结果

+0

我知道这是使用JPA正确的方式,但从我了解它也导致加载更大的对象到缓存中,我想避免这种情况。与核心业务逻辑中的动作表没有重要联系,所以我很好地使用了一次性解决方案。 我想到一个很像你发布的查询,但我不想创建这些连接,如果我不会广泛使用它们 - 这就是我试图避免使用加入 – levtatarov

+0

我认为,为了防止你可以使用(fetch = FetchType.LAZY) – Damian

+0

你的理解是错误的。每个关联都可以标记为延迟加载。你在与这个工具作斗争,因为你没有采取行动。不要惊讶地碰到墙壁。你最好的选择,如果你想这样做你的方式是使用左连接的本地SQL查询。 –