gpt4 book ai didi

sql - 休眠 HQL : Converting a SQL Statement to HQL (with subselects/joins)

转载 作者:行者123 更新时间:2023-12-02 15:27:19 25 4
gpt4 key购买 nike

非常感谢您帮助将以下 SQL 语句转换为有效的 HQL 语句。我尝试了几个小时但没有成功:

SELECT * FROM master as m left outer join (select * from child as c where c.id = (select max(d.id) from child as d where d.MasterFk = c.MasterFk) )as b ON m.id = b.MasterFk;


public class Master {
private Long id;
private Collection childs;
...
}

public Class Child {
private Long id;
private Master master;
}

在 Hibernate 映射文件中,我通过标准 SET(-映射)将主机映射到子机,并且从子机到主机的关系是多对一关联。 (这是有效的。)

==> 目标是仅使用最新的子记录(=仅一条记录!)来查询主记录,并将其正确初始化为子记录集中的唯一元素...

无论我尝试什么,我都惨遭失败。

非常感谢!

最佳答案

我不确定你能做到这一点。我看到的问题不是查询,而是初始化。如果您不返回 Set 的所有对象,那么我不确定 Hibernate 是否可以初始化 Set。

在 Hibernate 逻辑中,如果对象图中提供了一个对象(此处为 Set)(不为 null,无代理),则它应该是完整的。 仅包含一个元素的 Set,因此无法加载其他元素,因为它不是代理,不符合 Hibernate 逻辑。在 Hibernate 逻辑中,Set 要么是 null,要么是代理,要么是完全加载的(除了大型集合的高级情况,它们是批量加载的......)。

不过我理解你的需求。请注意,您需要确保将接收此对象图的代码都能够理解该 Set 并不是真正的一个!

我建议两种选择:

1。在 Java 中创建对象

另一种方法是查询所需的数据,然后在特定的 Java 代码中填写对象。

查询可以更简单,例如:

    SELECT m.id, max(c.id) 
FROM master as m
left join m.childs as c
group by m.id

java代码会实例化你想要的List<Object[]>结果。

或者,你可以给 Master 一个合适的构造函数,并使用 new (返回 List<Master> ):

    SELECT new Master(m.id, max(c.id)) 
FROM master as m
left join m.childs as c
group by m.id

2。添加成员

您还可以在 Master 上有一个最新子成员 (latestChild)。可以指定映射以完全按照您的需要加载它。

我建议一个公式,它的优点是只读。请注意,公式采用 SQL,而不是 HQL。插入与您的子请求相对应的 SQL。

关于sql - 休眠 HQL : Converting a SQL Statement to HQL (with subselects/joins),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1442728/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com