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)")
但要使其起作用,OrganizationEntity
和 UserEntity
之间必须存在关联。
作为替代方案,您始终可以使用本机查询,您可以在其中使用本机 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);
我使用 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)")
但要使其起作用,OrganizationEntity
和 UserEntity
之间必须存在关联。
作为替代方案,您始终可以使用本机查询,您可以在其中使用本机 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);