JPQL正确加入

时间:2016-02-04 05:25:09

标签: hibernate jpa-2.0 jpql right-join

搜索后,我发现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)

3 个答案:

答案 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

enter image description here

答案 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