Java 如何使用SpringMVC的SingleTableInheritation获取子类属性
我正在使用Spring、Hibernate和SpringMVC开发一个web应用程序, 我在使用单表继承策略从子类表中检索值时遇到了一个问题,下面是我的实体 Client.java(超级类) Societe.java(子类1) java(子类2) 在我的实现中,我使用这个方法来获取一个具有ID的特定客户机 ClientDaoImpl.javaJava 如何使用SpringMVC的SingleTableInheritation获取子类属性,java,spring,hibernate,spring-mvc,inheritance,Java,Spring,Hibernate,Spring Mvc,Inheritance,我正在使用Spring、Hibernate和SpringMVC开发一个web应用程序, 我在使用单表继承策略从子类表中检索值时遇到了一个问题,下面是我的实体 Client.java(超级类) Societe.java(子类1) java(子类2) 在我的实现中,我使用这个方法来获取一个具有ID的特定客户机 ClientDaoImpl.java public class ClientDaoImpl implements ClientDao { @PersistenceContext
public class ClientDaoImpl implements ClientDao {
@PersistenceContext
private EntityManager em;
@Override
public Client getClientByID(int id_client) {
return em.find(Client.class, id_client);
}
当我运行这段代码时,我只选择了超类客户机的属性
我想做的是根据客户类型或客户ID,找到一个客户及其子类,无论是兴业银行还是特殊客户
请帮助您可以修改getClientByID方法以接受一个附加参数,该参数将说明您要检索和获取的实体类型:
public class ClientDaoImpl implements ClientDao {
@PersistenceContext
private EntityManager em;
public <T extends Client> T getByID(int id_client, Class<T> klass) {
return em.find(klass, id_client);
}
}
由于您在查询之前不知道客户机的类型,并且只知道它的ID,因此需要在检索记录后检查类型并强制转换
Client client1 = clientDao.getClientById(clientID);
if (client1 instanceof Societe) {
((Societe) client1).getCommentaire();
}
根据您的用例,将客户机查询的结果映射到ClientDescriptor对象可能会很有用,该对象包含所有客户机类型的所有字段,并返回null或空格。这意味着您不必到处检查客户机类型
public class ClientDTO {
//client fields
private String nomResponsable = "";
....
//subclass 1 fields.... initialize to empty
//subclass 2 fields .... initialize to empty
public ClientDTO (Client client) {
// set fields for client entity
}
public ClientDTO (Societe societe) {
this (societe);
// set societe fields.
}
// other constructors.
}
欢迎来到堆栈溢出!寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:。这是一个很好的通用解决方案,但您确实需要在查询之前知道类型。@GrumpyWelshGit,是的,但它是最有可能的调用者预先知道实际类型的方法。这也是一个很好的方法,只是一个小建议,我会用
instanceof
或者甚至isAssignableFrom
来替换equals
。非常感谢你,它工作得很好,我没有考虑过,很简单:D,我很感谢你今天的抱怨。很高兴能帮忙!@BohdanLevchenko谢谢你的建议,回答更新。
public class ClientDaoImpl implements ClientDao {
@PersistenceContext
private EntityManager em;
public <T extends Client> T getByID(int id_client, Class<T> klass) {
return em.find(klass, id_client);
}
}
Societe societe = clientDao.getByID(42, Societe.class);
Particulier particulier = clientDao.getByID(43, Particulier.class);
Client client1 = clientDao.getClientById(clientID);
if (client1 instanceof Societe) {
((Societe) client1).getCommentaire();
}
public class ClientDTO {
//client fields
private String nomResponsable = "";
....
//subclass 1 fields.... initialize to empty
//subclass 2 fields .... initialize to empty
public ClientDTO (Client client) {
// set fields for client entity
}
public ClientDTO (Societe societe) {
this (societe);
// set societe fields.
}
// other constructors.
}