搜索后,我发现JPQL中没有正确加入。我看到有另一种方法可以使用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 |
我想要平面表中的所有行,只需要匹配User表
中的行// 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();
上面的代码将针对每个平面没有条件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)
答案 0 :(得分:3)
你应该让Flat表成为关系的所有者方(这使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
答案 1 :(得分:1)
R
RIGHT JOIN
S
又名 R
RIGHT OUTER JOIN
S
与
S
LEFT JOIN
R
又名 S
LEFT OUTER JOIN
R
答案 2 :(得分:0)
您将找不到JPQL中正确连接的任何(工作)示例。正如本EclipseLink forum post中所述,JPA规范不包括正确的连接:
JPA规范仅定义了左外连接。随意提交 EclipseLink增强或请求将其包含在JPA中 说明书
也许你可以诉诸native query?