我无法将一个稍微复杂(~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);
答案 0 :(得分:1)
HQL不使用表名和列名,而是使用实体和字段/属性名。你没有发布你的实体,所以很难回答。但是您的查询似乎使用列名,或者您的Java代码根本不遵守Java约定。
此外,在连接上不需要任何on
子句,因为您使用实体之间的关联进行连接,并且由于这些关联已经使用JoinTable / JoinColumn映射,因此Hibernate知道必须如何连接表。
因此,假设您的实体尊重Java命名约定,并且Type
和Module
实体之间存在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