Hibernate JOIN [some entity] ON unexpected token

Hibernate JOIN [some entity] ON unexpected token

我使用 Hibernate 5.4.32.Final,当我尝试通过 spring 数据执行此查询时:

@Query("select new some.package.dto.TwoFieldDto(o.gln, u.email) "
            + "from OrganizationEntity o "
            + "join UserEntity u on u.organization.id = o.id "
            + "where o.gln in (:glnList)")
    List<TwoFieldDto<String, String>> findEmailListByGlnIn(List<String> glnList);

启动应用程序时,Hibernate 在到达 UserEntity 令牌时抛出 SyntexException,并发出意外令牌。

如果我尝试从 UserEntity 端执行查询,查询编译成功。 (是的,我还没有得到从 OrganizationEntity 到 UserEntity 的 link)

这个 Hibernate 版本不支持 JOIN ON syntex 吗? (OrganizationEntity 不包含 UserEntity 上的 link,但 UserEntity 包含它)。

@Query注释默认需要 JPQL,它有自己的语法。据我所知,你不能在 JPQL 中做类似 JOIN .. ON 的事情。 我不知道你们实体之间的关联,但它应该看起来像这样:

@Query("select new some.package.TwoFieldDto(o.gln, u.email) "
            + "from OrganizationEntity o "
            + "join o.UserEntity u "
            + "where o.gln in (:glnList)")

但要使其起作用,OrganizationEntityUserEntity 之间必须存在关联。

作为替代方案,您始终可以使用本机查询,您可以在其中使用本机 SQL 方言执行 JOIN .. ON

@Query(value = "SELECT ....", nativeQuery = true)

但只有当您确定不能使用 JPQL 时,才应该选择此选项。

除@Philipp 的回答外:从 Hibernate 执行此类连接的最佳方法是将双向 @OneToMany 依赖项添加到 OrganizationEntity,如下所示:

 @OneToMany(mappedBy = UserEntity_.ORGANIZATION, fetch = FetchType.LAZY)
 private List<UserEntity> organizationUsers;

然后你可以很容易地写:

   @Query("select o.gln, u.email from OrganizationEntity o "
            + "join o.organizationUsers u "
            + "where o.pan in (:pans)")
    List<Object[]> findQuery(List<String> pans);