排序 HQL 连接路径错误

Sorting HQL join path errors

我在将稍微复杂的 (~8 sloc) SQL 查询转换为 HQL 语言时遇到问题。

折腾了一天,可惜网上的例子太琐碎了,帮不上什么忙。我已将我的查询减少到仍然给出路径错误的最小样本。任何线索将不胜感激。

SQL(有效)

SELECT container_modulelist 
FROM project.t_type 
INNER JOIN project.t_module ON project.t_type.module_id =project.t_module.id 
WHERE project.t_type.id = 111

HQL(给出连接路径错误)

    @Query("
select module.container_modulelist 
from Type type 
join Module module on type.module_id = module.id 
where type.id =111
")

更新:以上部分应该通过下面的答案解决

但是,我仍然无法执行子查询。

我测试了括号外的部分,效果很好。但是我在实现括号中的部分时遇到了问题(来自下面的答案),我想评估子查询并将其进行比较以便我的查询与 return 值,我已经看到这可以是从 HQL 文档完成。在当前形式中,无论参数如何,子查询都不会return。

等效(?)HQL(子查询不起作用):

@Query("
        select value from Value value
            where value.type.module.containerModuleList = (
                select type.module.containerModuleList from Type type 
                    where type.id =111) and value.name =yyy5
")
Value findOneByNameFromModuleList(@Param("id") Long id, @Param("name") String name);

工作部分:

 @Query("
         select value from Value value
             where value.type.module.containerModuleList = 1 and value.name =yyy5
 ")
 Value findOneByNameFromModuleList(@Param("name") String name);

HQL 不使用 table 和列名称,而是使用实体和 field/property 名称。你不是 post 你的实体,所以很难回答。但是您的查询似乎使用了列名,或者您的 Java 代码根本不遵守 Java 约定。

此外,您不需要任何关于联接的 on 子句,因为您使用实体之间的关联进行联接,并且由于这些关联已经映射到 JoinTable/JoinColumn,Hibernate 知道 table必须加入。

因此,假设您的实体遵守 Java 命名约定,并且您在 TypeModule 实体之间有 ManyToOne 关联(即有一个字段 module of type Module with annotated with @ManyToOne in Type), 查询应该是

select cml
from Type type 
join type.module module
join module.containerModuleList cml
where type.id = 111

或者干脆

select type.module.containerModuleList from Type type where type.id = 111

This is documented.