JPQL 右连接

JPQL Right Join

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

       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    |

我想要来自 flat table 的所有行,并且只需要来自用户 table

的匹配行
// 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 双向并使用对象获取 eg

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

上面的代码将在条件 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)

RRIGHT JOINS又名RRIGHT OUTER JOINS

相同

SLEFT JOINR 又名 SLEFT OUTER JOINR.

您在 JPQL 中找不到任何(有效的)右连接示例。如本 EclipseLink forum post 中所述,JPA 规范不包括右连接:

The JPA spec only defines a Left Outer Join. Feel free to file an EclipseLink enhancement or request its inclusion in the JPA specification.

也许你可以求助于 native query

您应该使公寓 table 成为关系的所有者一方(在我看来这更合乎逻辑)。然后您可以使用 LEFT JOIN 而不是 RIGHT JOIN。

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

Here's why left join on UserTable works:

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