JPQL 右连接

Posted

技术标签:

【中文标题】JPQL 右连接【英文标题】:JPQL Right Join 【发布时间】:2016-05-13 14:22:46 【问题描述】:

经过搜索,我知道 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 并使用对象获取 eg

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

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

【问题讨论】:

JPQL中有正确的join。 @DraganBozanovic 你能给我一些例子吗,因为我遇到了错误。我正在发布我的映射配置。 我在您的查询中没有看到任何 from 子句。我建议你先阅读一些 Hibernate/JPA 教程。 @DraganBozanovic 这是我的打字错误,没有 from 子句 好的,你能把你在正确加入时遇到的错误贴出来吗? 【参考方案1】:

您应该使平面表成为关系的所有者方(这在 IMO 中更具逻辑意义)。然后,您可以使用 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

【讨论】:

【参考方案2】:

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

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

也许您可以求助于native query?

【讨论】:

【参考方案3】:

RRIGHT JOINS 又名 RRIGHT OUTER JOINS

一样

SLEFT JOINR 又名 SLEFT OUTER JOINR .

【讨论】:

以上是关于JPQL 右连接的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 的内连接、左连接、右连接有啥区别?

SQL中的左连接与右连接,内连接有啥区别

MySQL连接查询之内连接左连接右连接自连接

oracle中的右连接和左连接有啥区别?如果我们可以实现左连接在右连接中可以做的事情,为啥要使用 2 个单独的连接?

左连接和右连接的理解?

左外连接与右外连接区别?