Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.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
Hibernate 如何在不获取所有对象的情况下从基于JPA的条目中获取实际的实体类型_Hibernate_Jpa - Fatal编程技术网

Hibernate 如何在不获取所有对象的情况下从基于JPA的条目中获取实际的实体类型

Hibernate 如何在不获取所有对象的情况下从基于JPA的条目中获取实际的实体类型,hibernate,jpa,Hibernate,Jpa,我需要从基于JPA的条目中获取实际的实体类型,而无需获取所有对象。例如,有两个实体-超级用户扩展用户 我想得到 id type 1 com.company.domain.SuperUser 2 com.company.domain.User 情况: 使用者 超级用户 @DiscriminatorValue(value = "SuperUser") @Entity public class SuperUser extends User implements Serializab

我需要从基于JPA的条目中获取实际的实体类型,而无需获取所有对象。例如,有两个实体-超级用户扩展用户

我想得到

id  type
1   com.company.domain.SuperUser   
2   com.company.domain.User 
情况:

使用者

超级用户

@DiscriminatorValue(value = "SuperUser")
@Entity
public class SuperUser extends User implements Serializable {

    private static final long serialVersionUID = 2L;
}
当前条目数据

INSERT INTO users(DTYPE, id) VALUES('SuperUser',1);
INSERT INTO users(DTYPE, id) VALUES('User',2);
我试图获取实体类和列id,但得到的是NullPointerException。我做错了什么

EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("persistence");
EntityManager entityManager = entityManagerFactory.createEntityManager();

Query query;

//Works
query = entityManager.createQuery("select type(us), us.id From User us where type(us) = 'SuperUser'");
query.getResultList();
//Works
query = entityManager.createQuery("select type(us), us.id From SuperUser us");
query.getResultList();

//Throws NPE
query = entityManager.createQuery("select type(us), us.id From User us where type(us) = 'User'");
query.getResultList();
//Throws NPE
query = entityManager.createQuery("select type(us), us.id From User us");
query.getResultList();
更新: 添加stackTrace:

Exception in thread "main" java.lang.NullPointerException
    at org.hibernate.tuple.entity.PojoEntityTuplizer.determineConcreteSubclassEntityName(PojoEntityTuplizer.java:333)
    at org.hibernate.persister.entity.AbstractEntityPersister.getSubclassEntityPersister(AbstractEntityPersister.java:4581)
    at org.hibernate.internal.SessionImpl.getEntityPersister(SessionImpl.java:1456)
    at org.hibernate.persister.entity.DiscriminatorType.nullSafeGet(DiscriminatorType.java:72)
    at org.hibernate.persister.entity.DiscriminatorType.nullSafeGet(DiscriminatorType.java:59)
    at org.hibernate.loader.hql.QueryLoader.getResultRow(QueryLoader.java:452)
    at org.hibernate.loader.hql.QueryLoader.getResultColumnOrRow(QueryLoader.java:435)
    at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:756)
    at org.hibernate.loader.Loader.processResultSet(Loader.java:972)
    at org.hibernate.loader.Loader.doQuery(Loader.java:930)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:336)
    at org.hibernate.loader.Loader.doList(Loader.java:2611)
    at org.hibernate.loader.Loader.doList(Loader.java:2594)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2423)
    at org.hibernate.loader.Loader.list(Loader.java:2418)
    at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:501)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:371)
    at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:220)
    at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1268)
    at org.hibernate.internal.QueryImpl.list(QueryImpl.java:87)
    at org.hibernate.jpa.internal.QueryImpl.list(QueryImpl.java:567)
    at org.hibernate.jpa.internal.QueryImpl.getResultList(QueryImpl.java:436)
    at com.geowarin.hibernate.jpa.standalone.App.tryFetch(App.java:40)
    at com.geowarin.hibernate.jpa.standalone.App.main(App.java:19)

请添加stacktrace。根据JPA规范,您不能与字符串文本进行比较。您应该这样比较,其中type(us)=SuperUser。这改变了吗?更新的摘要。应用你的建议,结果是一样的。在你的用户类上定义
@DiscriminatorValue
?即使在你的用户类上定义
@DiscriminatorValue
有效并避免了异常,你仍然应该在你的JPA提供程序上引发一个错误,因为将NPE转储给用户(用于内部类处理)这是一种糟糕的做法,它不会告诉用户任何关于causeKindly add stacktrace的信息。根据JPA规范,您不会与字符串文本进行比较。您应该这样比较,其中type(us)=SuperUser。这改变了吗?更新的摘要。应用你的建议,结果是一样的。在你的用户类上定义
@DiscriminatorValue
?即使在你的用户类上定义
@DiscriminatorValue
有效并避免了异常,你仍然应该在你的JPA提供程序上引发一个错误,因为将NPE转储给用户(用于内部类处理)这是一种不好的做法,不会告诉用户原因
Exception in thread "main" java.lang.NullPointerException
    at org.hibernate.tuple.entity.PojoEntityTuplizer.determineConcreteSubclassEntityName(PojoEntityTuplizer.java:333)
    at org.hibernate.persister.entity.AbstractEntityPersister.getSubclassEntityPersister(AbstractEntityPersister.java:4581)
    at org.hibernate.internal.SessionImpl.getEntityPersister(SessionImpl.java:1456)
    at org.hibernate.persister.entity.DiscriminatorType.nullSafeGet(DiscriminatorType.java:72)
    at org.hibernate.persister.entity.DiscriminatorType.nullSafeGet(DiscriminatorType.java:59)
    at org.hibernate.loader.hql.QueryLoader.getResultRow(QueryLoader.java:452)
    at org.hibernate.loader.hql.QueryLoader.getResultColumnOrRow(QueryLoader.java:435)
    at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:756)
    at org.hibernate.loader.Loader.processResultSet(Loader.java:972)
    at org.hibernate.loader.Loader.doQuery(Loader.java:930)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:336)
    at org.hibernate.loader.Loader.doList(Loader.java:2611)
    at org.hibernate.loader.Loader.doList(Loader.java:2594)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2423)
    at org.hibernate.loader.Loader.list(Loader.java:2418)
    at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:501)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:371)
    at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:220)
    at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1268)
    at org.hibernate.internal.QueryImpl.list(QueryImpl.java:87)
    at org.hibernate.jpa.internal.QueryImpl.list(QueryImpl.java:567)
    at org.hibernate.jpa.internal.QueryImpl.getResultList(QueryImpl.java:436)
    at com.geowarin.hibernate.jpa.standalone.App.tryFetch(App.java:40)
    at com.geowarin.hibernate.jpa.standalone.App.main(App.java:19)