5

经过搜索,我知道 JPQL 中没有 Right Join。我看到还有另一种使用 JPA 双向实现它的方法(不是右连接,而是使用 pojo 对象),但我在控制台中注意到它对数据库进行了多次调用,例如见下表。

       Flat Table                   UserToFlat                    User
| Flat_ID  |  Flat No  |      | ID   |  Flat_ID | User_ID |    | User_ID | Name |
|  1       |    101    |      | 1    |    1     |  1      |    |   1     | XYZ  |  
|  2       |    102    |      | 2    |    2     |  2      |    |   2     | PQR  |
|  3       |    103    |      | 3    |    3     |  3      |    |   3     | ABC  |
|  4       |    104    |

我想要平面表中的所有行,并且只想要用户表中的匹配行

// below query do not work as flat is having primary key and usertoflat having foreign key
select f, u from FlatEntity f left join f.userToFlatEntity uf join uf.user u;

// now if I try right join then jpql throws exception
select f from UserToFlatEntity uf right join uf.flatEntity f;

现在,如果我使用 jpql birectional 并使用对象获取例如

// suppose I have FlatEntity Object 
flatEntity.getUserToFlatEntity();

上面的代码将在 where condition flat_ID = ? (在这种情况下是 4 次),我认为这不是很好的表现。

那么有什么方法可以让 JPQL 在不影响性能的情况下实现正确的连接。

实体配置

public class FlatEntity {
    @OneToOne(mappedBy = "flatEntity")
    private UserToFlatEntity userToFlatEntity;

   // getter setter
}

public class UserToFlatEntity {
    @ManyToOne
    @JoinColumn(name = "flatId", insertable = false, updatable = false)
    private FlatEntity flatEntity;
}

public class UserEntity {
    @OneToMany(mappedBy = "userEntity")
    private Set<UserToFlatEntity> userToFlatEntitySet;
}

Exception
 Path expected for join!
 at org.hibernate.hql.internal.ast.HqlSqlWalker.createFromJoinElement(HqlSqlWalker.java:369)
4

3 回答 3

3

您应该使平面表成为关系的所有者(这在 IMO 中更具逻辑意义)。然后,您可以使用 LEFT JOIN 而不是 RIGHT JOIN。

SELECT uc, MAX(ua.accessTs) FROM Flat Table uc LEFT JOIN uc.User Table ua

这就是 UserTable 上的左连接有效的原因:

有关更多详细信息,请访问此处:JPQL 中的 RIGHT JOIN

在此处输入图像描述

于 2016-02-17T13:18:41.917 回答
2

RRIGHT JOINSaka是一样的 RRIGHT OUTER JOINS

SLEFT JOINR又名。SLEFT OUTER JOINR

于 2016-02-13T23:28:59.487 回答
0

您不会在 JPQL 中找到任何(有效的)右连接示例。正如这个EclipseLink 论坛帖子中提到的,JPA 规范不包括右连接:

JPA 规范只定义了一个左外连接。随意提交 EclipseLink 增强或请求将其包含在 JPA 规范中。

也许您可以求助于本机查询

于 2016-02-15T18:21:25.307 回答