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)
R
RIGHT JOIN
S
又名R
RIGHT OUTER JOIN
S
与
相同
S
LEFT JOIN
R
又名 S
LEFT OUTER JOIN
R
.
您在 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
查了一下才知道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)
R
RIGHT JOIN
S
又名R
RIGHT OUTER JOIN
S
与
S
LEFT JOIN
R
又名 S
LEFT OUTER JOIN
R
.
您在 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