我已经在我的应用程序中设计了实体,以遵循 Hibernate的继承策略Inheritance.JOINED
。
基本抽象类为UserTable
,具体派生类为ClientTable
和OwnerTable
。
我想要实现的是拥有一个存储库,find
UserTable
ClientTable
和OwnerTable
Id
Email
}或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);
。
所以这样的事情应该是可能的:
@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
}
我的实体看起来像这样。
UserTable.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
}
..和主键
UserTablePK.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
}
ClientTable.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
}
OwnerTable.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
}
现在一旦设置了实体,我需要编写一个如上所述的存储库,这里是我需要帮助的地方。我想写这样的东西。
UserTableRepository.java
Query
我实际上还没有尝试过这个,因为我想检查这是否是正确的路线,但是:我对此JOIN ClientTable
会起作用持怀疑态度。因为为了检索整个子类对象,应该使用某种JOIN,问题是我不能明确地说ie。 OwnerTable
因为那时我无法获取任何List<ClientTable> clients = repository.findAllClients();
个实体。
如何实现我可以从同一个存储库中获取两个子类?
此外,要求是能够获取特定的子类。如下所示:
@Repository
public interface ClientTableRepository extends CrudRepository<ClientTable, ClientTablePK> {
// empty
}
是否可以使用相同的存储库,或者我应该编写特定于子类的存储库?例如。
ClientTableRepository repository = // ...
List<ClientTable> clients = repository.findAll();
...然后将它们称为:
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jquery-confirm/3.0.3/jquery-confirm.min.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-confirm/3.0.3/jquery-confirm.min.js"></script>
JPA是否足以确定如何查找特定子类的所有实例?
答案 0 :(得分:0)
您想要实现的是JPA中的继承是如何工作的。
因此,您的查询完全没问题,您将在结果列表中拥有子类的实例。
在我的一篇博文中了解有关JPA继承的更多信息: