Hibernate 如何在不获取所有对象的情况下从基于JPA的条目中获取实际的实体类型
我需要从基于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
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)