gpt4 book ai didi

java - 具有 Inheritance.JOINED 的 Spring Data Repository

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:23:38 25 4
gpt4 key购买 nike

我在应用程序中设计的实体遵循Hibernate 的 继承策略Inheritance.JOINED

基础抽象类是UserTable,具体派生类是ClientTableOwnerTable

我想要实现的是拥有一个存储库,我可以在其中找到任何UserTable(包括ClientTableOwnerTable) 通过 IdEmail。重要的要求是一旦它们被获取,它们就可以转换为正确的类型,并且它们带有它们的特定字段(而不仅仅是从 UserTable 继承的字段)。

同样重要的是,我应该能够通过同一个存储库持久化这些实体,即。 repository.save(clientTable)

所以这样的事情应该是可能的:

UserTableRepository repository = // ...

int clientId = 3;
int ownerId = 5;

ClientTable clientTable = (ClientTable) repository.findByUserId(clientId);
OwnerTable clientTable = (OwnerTable) repository.findByUserId(ownerId);

clientTable = (ClientTable) repository.findByEmail(clientEmail);
ownerTable = (OwnerTable) repository.findByEmail(ownerEmail);

我的实体看起来像这样。

用户表.java

@Entity
@Table(name = "USER")
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class UserTable implements Serializable {

@Column(name = "USER_ID", nullable = false)
private Long userId;

@EmbeddedId
private UserTablePK userTablePK;

@Column(name = "PASSWORD", nullable = false, length = 512)
private String password;

@Column(name = "FIRSTNAME", nullable = false, length = 256)
private String firstName;

// get, set
}

..和一个主键

UserTablePK.java

@Embeddable
public class UserTablePK implements Serializable {

private static final long serialVersionUID = 1L;

@Column(name = "EMAIL", nullable = false, length = 256)
private String email;

public UserTablePK() {
}

public UserTablePK(String email) {
this.email = email;
}

// get, set
}

ClientTable.java

@Entity
@Table(name = "CLIENT")
public class ClientTable extends UserTable implements Serializable {

@Column(name = "SHOPING_POWER")
private Integer shoppingPower;

@Column(name = "SHOPPING_FREQUENCY")
private Integer shoppingFreq;

// get, set
}

OwnerTable.java

@Entity
@Table(name = "OWNER")
public class OwnerTable extends UserTable implements Serializable {

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

@Column(name = "SALARAY")
private Integer;

// get, set
}

现在一旦设置了实体,我就需要编写一个像上面描述的那样运行的存储库,这就是我需要一些帮助的地方。我想写这样的东西。

UserTableRepository.java

@Repository
public interface UserTableRepository extends CrudRepository<UserTable, UserTablePK> {

@Query("SELECT e FROM UserTable e WHERE e.userTablePK.email = ?1")
public UserTable findByEmail(String email); // if owner email, retrieve OwnerTable; if client email, retrieve ClientTable instance

@Query("SELECT e FROM UserTable e WHERE e.userId = ?1")
public UserTable findByUserId(Long userId); // if owner id, retrieve OwnerTable; if client id, retrieve ClientTable instance
}

我实际上还没有尝试这个,因为我想检查这是否是正确的路线,但是:我相当怀疑这个 Query 是否有效。因为为了检索整个子类对象,应该使用某种 JOIN,问题是我不能明确地说 ie。 JOIN ClientTable 因为那时我将无法获取任何 OwnerTable 实体。

我怎样才能从同一个存储库中获取两个子类?

更新

此外,要求是能够获取特定子类。所以像这样:

List<ClientTable> clients = repository.findAllClients();

是否可以使用相同的存储库,或者我应该编写特定于子类的存储库?例如。

@Repository
public interface ClientTableRepository extends CrudRepository<ClientTable, ClientTablePK> {
// empty
}

...然后像这样称呼他们:

ClientTableRepository repository = // ...

List<ClientTable> clients = repository.findAll();

这是否足以让 JPA 确定如何查找特定子类的所有实例?

最佳答案

您想要实现的正是 JPA 中继承的工作方式。

因此您的查询非常好,您将在结果列表中拥有子类的实例。

阅读我的一篇博文中有关 JPA 继承的更多信息:

https://72.services/inheritance-in-jpa/

关于java - 具有 Inheritance.JOINED 的 Spring Data Repository,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48701208/

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