gpt4 book ai didi

java - Hibernate 选择具有子项匹配子参数列表的父项

转载 作者:行者123 更新时间:2023-11-30 06:54:42 24 4
gpt4 key购买 nike

我有以下结构:Bank 有名称和办公室列表Officecity 属性。

如何使用 hql 选择具有自己的 Offices 列表的 Banks,仅具有特定的 city

代码:
银行

@Entity
@Table(name = "BANKS")
public class Bank {
public Bank() {
}

public Bank(String name) {
this.name = name;
}

@Id
@Column(name = "ID")
@GeneratedValue
private int id;

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

/*@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true)*/
@OneToMany(mappedBy = "bank", cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true)
/*@JoinColumn(name = "BANK_ID")*/
private List<Office> officeList;

办公室

@Entity
@Table(name = "OFFICES")
public class Office {
public Office() {
}

public Office(String city, String address, String workingHours, Bank bank) {
this.city = city;
this.address = address;
this.workingHours = workingHours;
this.bank = bank;
}

@Id
@Column(name = "ID")
@GeneratedValue
private int id;

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "BANK_ID")
@JsonBackReference
private Bank bank;

public void setBank(Bank bank) {
this.bank = bank;
}

public Bank getBank() {
return bank;
}

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

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

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

我已经写了请求,但它工作不正常:

sessionFactory.getCurrentSession().createQuery("select b from Bank b join b.officeList o" +
" where o.city = ?").setString(0, city).list();

任何帮助将不胜感激。

最佳答案

关于第一点,重复是预期的,因为你加入了一个集合,你可以很容易地用 distinct 消除它们:

select distinct b from Bank b join b.officeList o where o.city = :city

第二点(officeList 仅包含匹配的属性)在概念上要复杂得多。

要点是,在为 Bank 实例初始化 officeList 集合期间,Hibernate 会加载与相应银行关联的所有办公室。这就是 Hibernate 应该做的:在对象图中反射(reflect)数据库状态。这与您加入了哪些实体/表以及您在用于检索银行的原始查询中指定的哪些where条件无关。

但是,通过使用 [left] join fetch 构造,可以在加载父项的同一查询中初始化子项关联。例如,要在一个查询中加载所有银行及其所有办事处,您可以执行以下操作:

select distinct b from Bank b left join fetch b.officeList

Hibernate 支持在 where 条件下使用别名和使用 fetch 连接实体。这样,您基本上只使用数据库中元素的子集来初始化集合。因此,要实现您的需要,您可以将查询更改为:

select distinct b from Bank b join fetch b.officeList o where o.city = :city

但是,请记住,JPA 规范不支持在查询的过滤条件中使用 fetch 加入关联。另外,如果你使用二级缓存并且这个集合缓存在那里,你应该调查对二级缓存有什么影响。

关于java - Hibernate 选择具有子项匹配子参数列表的父项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36103442/

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