gpt4 book ai didi

hibernate - 查询存储在单独集合中的 @Embeddable 对象

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

我有一个简单的关系,其中一个实体有许多特定于它的地址,定义为:

@Entity
public class Corporation {

@Id
private Long id;

@ElementCollection
@CollectionTable(name = "addresses_table", joinColumns = @JoinColumn(name = "corporation_id"))
private List<Address> addresses = new ArrayList<>();
}

Address 类用 @Embeddable 进行注释。这非常有效,因为公司的每次更新都会删除其所有地址,然后插入新地址。这正是我正在寻找的行为。我尝试过的其他选项(OneToManyManyToMany)会导致性能较差,因为我需要跳过障碍,但仍然无法获得简单的删除所有 + 插入所有行为.

但是,有一个简单的要求,我需要能够按某些条件查询地址。基本上,这可以归结为一个简单的 findAll(Pageable pageable, Specific spec) 方法。这对于当前和 future 的用例来说已经足够了。

现在的问题是,可嵌入对象不是实体,因此我无法为它们创建 Spring 数据存储库。我能想到的唯一选择是:

  1. 使用 native 实体管理器实现自定义存储库,但我不确定如何在代码方面最优化地实现此目的,以及它是否可以支持通用规范。如果不是,我仍然可以接受,因为搜索地址的字段不会改变。

  2. 执行一些联接查询,如select sth from Corporation c join c.addresses,然后根据地址属性限制结果。在这里,我再次不确定这是否可行并且与直接对地址表进行简单排队一样高效

任何关于所描述的选项或其他替代方案的建议将不胜感激。

最佳答案

单个表可以映射到不同的类。那么为什么不创建另一个通常的 @Entity 类的 Address 类,以便您可以创建存储库并使用您想要使用的规范

@Embeddable Address 可以被视为 Corporation 的内部类,用于提供删除所有 + 插入所有行为。如果您希望域客户端仅处理一个 Address 类,您可以简单地在 @Embeddable Address 和 @Entity Address 之间进行转换。

从代码角度来看,它看起来像:

@Entity
public class Corporation {

@Id
private Long id;

@ElementCollection
@CollectionTable(name = "addresses_table", joinColumns = @JoinColumn(name = "corporation_id"))
private List<CorporationAddress> addresses = new ArrayList<>();


public void addAddress(Address address){
addresses.add(new CorporationAddress(address));
}

public List<Address> getAddresses(){
return addresses.stream()
.map(CorporationAddress::toAddress).collect(toList());
}

}


//Or you can put it as the internal static nested class inside Corporation if you like
@Embeddable
public class CorporationAddress {

//Create from Address
public CorporationAddress(Address){
}

//Convert to Address
public Address toAddress(){

}

}

@Entity
public class Address {


}

关于hibernate - 查询存储在单独集合中的 @Embeddable 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57177024/

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