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】:R
RIGHT JOIN
S
又名 R
RIGHT OUTER JOIN
S
和
S
LEFT JOIN
R
又名 S
LEFT OUTER JOIN
R
.
【讨论】:
以上是关于JPQL 右连接的主要内容,如果未能解决你的问题,请参考以下文章