排序HQL连接路径错误

时间:2015-10-26 17:54:09

标签: hibernate jpa hql

我无法将一个稍微复杂(~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
")

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

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

我测试了括号外的部分,效果很好。但是我在括号中实现该部分时遇到了问题(从下面的答案中),我想评估子查询并比较它以便我的查询返回值,我已经看到这可以从HQL文档。在当前形式中,无论参数如何,子查询都不会返回任何内容。

等效(?)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);

1 个答案:

答案 0 :(得分:1)

HQL不使用表名和列名,而是使用实体和字段/属性名。你没有发布你的实体,所以很难回答。但是您的查询似乎使用列名,或者您的Java代码根本不遵守Java约定。

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

因此,假设您的实体尊重Java命名约定,并且TypeModule实体之间存在ManyToOne关联(即module类型的字段Module 1}}使用@ManyToOne中的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