gpt4 book ai didi

java - 具有父子关系的实体(单表)的HQL查询

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

我正在尝试使用 HQL 创建简单的选择查询。有一个将在查询中使用的实体。它看起来像下面这样:

@Entity
@Table(name = "my_table")
public class MyTable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private Long id;

@Column(name = "name")
private String name;

@Column(name = "test_id")
private Long testId;

@Column(name = "parent_id")
private Long parentId;

@OneToMany(mappedBy = "parentId",
fetch = FetchType.EAGER,
cascade = CascadeType.ALL)
private Set<MyTable> children = new HashSet<MyTable>();

//getters and setters
}

层次结构很简单。有 parent (其parent_id 值为空)和他们的 child 。所以只有两个级别。

我想创建选择所有 parent 及其 child 的查询,但 child 有一个条件:它应该等于特定的test_id。例如。仅需要 test_id = 1 才有 child 。表由 Parent1 和 Child1 (test_id = 2) 和 Parent2 和 Child2 (test_id = 1) 组成。查询结果应为没有子项的 Parent1 和有 Child2 的 Parent2。

查询:

from MyTable as myTable left fetch join myTable.children as child 
where child.testId = 1

结果 - 我只得到那些 child 具有 “1” test_id 的 parent 。但我需要所有 parent 都看到,即使没有需要的 child 。这里出了什么问题:映射还是查询?实际上应该怎样?

提前致谢。

最佳答案

您的映射是错误的。您有一个单向 OneToMany 关联。所以你显然必须告诉 Hibernate 这个关联是如何映射的。你告诉的是:

@OneToMany(mappedBy = "parentId", ...)

这意味着:“去看看这个双向关联的另一边,看看这个关联是如何映射的。我只是反面”。

但没有另一面。您的关联是单向的。

映射应该是:

@Entity
@Table(name = "my_table")
public class MyTable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private Long id;

@Column(name = "name")
private String name;

@Column(name = "test_id")
private Long testId;

@OneToMany(fetch = FetchType.EAGER,
cascade = CascadeType.ALL)
@JoinColumn(name = "parentId")
private Set<MyTable> children = new HashSet<MyTable>();

//getters and setters
}

请注意,parentId 字段已被删除,因为它已用于映射子级关联。

另一个问题是你的期望。查询返回列,或者返回实体。如果它返回父实体并且您向该实体询问其子实体,则将返回所有子实体。实体代表数据库中的内容。它不代表特定查询的结果。

如果您只想拥有一些 child ,您可以做的就是搜索 child 并找到他们的 parent 。为此,您需要将关联设置为双向:

@Entity
@Table(name = "my_table")
public class MyTable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private Long id;

@Column(name = "name")
private String name;

@Column(name = "test_id")
private Long testId;

@ManyToOne
@JoinColumn(name="parentId")
private MyTable parent;

@OneToMany(mappedBy="parent",
fetch = FetchType.EAGER,
cascade = CascadeType.ALL)
@JoinColumn(name = "parentId")
private Set<MyTable> children = new HashSet<MyTable>();

//getters and setters
}

查询将是:

select child from MyTable child 
left join fetch child.parent
where child.testId = 1

这将返回 testId = 1 的所有子级及其父级。您需要第二次查询才能获取所有其他 parent 。类似的东西

select parent from MyTable parent 
where parent.id not in (
select parent2.id from MyTable child
left join child.parent parent2
where child.testId = 1)

关于java - 具有父子关系的实体(单表)的HQL查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14650163/

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