Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用SpringMVC的SingleTableInheritation获取子类属性_Java_Spring_Hibernate_Spring Mvc_Inheritance - Fatal编程技术网

Java 如何使用SpringMVC的SingleTableInheritation获取子类属性

Java 如何使用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

我正在使用Spring、Hibernate和SpringMVC开发一个web应用程序, 我在使用单表继承策略从子类表中检索值时遇到了一个问题,下面是我的实体

Client.java(超级类)

Societe.java(子类1)

java(子类2)

在我的实现中,我使用这个方法来获取一个具有ID的特定客户机

ClientDaoImpl.java

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.
}