排序 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 命名约定,并且您在 Type
和 Module
实体之间有 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
我在将稍微复杂的 (~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 命名约定,并且您在 Type
和 Module
实体之间有 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