2015-12-10 4 views
0

(найти Postgres 9.3 и спящий режим 4.3.7 версии в приведенном ниже StackTrace)JPA родной запрос с @DiscriminatorFormula бросает NullPointerException на слое Hibernate/Postgres

Моей базы и один выборочным подтип сущности:

import javax.persistence.Entity; 
import org.hibernate.annotations.DiscriminatorFormula; 
import javax.persistence.DiscriminatorValue; 

@Entity 
@DiscriminatorFormula(value = "'test'") 
public abstract class Base { 
    @Id String id; 
} 

@Entity 
@DiscriminatorValue(value = "test") 
public class Sub extends Base { 
} 

Вызывающие

myEntityManager.createNativeQuery(someSql, Base.class).getResultsList() 

приводит

java.lang.NullPointerException: null 
    at org.postgresql.jdbc2.AbstractJdbc2ResultSet.findColumnIndex(AbstractJdbc2ResultSet.java:2758) ~[postgresql-9.3-1102-jdbc41.jar:na] 
    at org.postgresql.jdbc2.AbstractJdbc2ResultSet.findColumn(AbstractJdbc2ResultSet.java:2726) ~[postgresql-9.3-1102-jdbc41.jar:na] 
    at org.postgresql.jdbc2.AbstractJdbc2ResultSet.getString(AbstractJdbc2ResultSet.java:2568) ~[postgresql-9.3-1102-jdbc41.jar:na] 
    at com.mchange.v2.c3p0.impl.NewProxyResultSet.getString(NewProxyResultSet.java:3326) ~[c3p0-0.9.2.1.jar:0.9.2.1] 
    at org.hibernate.type.descriptor.sql.VarcharTypeDescriptor$2.doExtract(VarcharTypeDescriptor.java:74) ~[hibernate-core-4.3.7.Final.jar:4.3.7.Final] 
    at org.hibernate.type.descriptor.sql.BasicExtractor.extract(BasicExtractor.java:64) ~[hibernate-core-4.3.7.Final.jar:4.3.7.Final] 
    at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:267) ~[hibernate-core-4.3.7.Final.jar:4.3.7.Final] 
    at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:263) ~[hibernate-core-4.3.7.Final.jar:4.3.7.Final] 
    at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:258) ~[hibernate-core-4.3.7.Final.jar:4.3.7.Final] 
    at org.hibernate.loader.Loader.getInstanceClass(Loader.java:1759) ~[hibernate-core-4.3.7.Final.jar:4.3.7.Final] 
    at org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.java:1587) ~[hibernate-core-4.3.7.Final.jar:4.3.7.Final] 
    at org.hibernate.loader.Loader.getRow(Loader.java:1515) ~[hibernate-core-4.3.7.Final.jar:4.3.7.Final] 
    at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:726) ~[hibernate-core-4.3.7.Final.jar:4.3.7.Final] 
    at org.hibernate.loader.Loader.processResultSet(Loader.java:953) ~[hibernate-core-4.3.7.Final.jar:4.3.7.Final] 
    at org.hibernate.loader.Loader.doQuery(Loader.java:921) ~[hibernate-core-4.3.7.Final.jar:4.3.7.Final] 
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:355) ~[hibernate-core-4.3.7.Final.jar:4.3.7.Final] 
    at org.hibernate.loader.Loader.doList(Loader.java:2554) ~[hibernate-core-4.3.7.Final.jar:4.3.7.Final] 
    at org.hibernate.loader.Loader.doList(Loader.java:2540) ~[hibernate-core-4.3.7.Final.jar:4.3.7.Final] 
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2370) ~[hibernate-core-4.3.7.Final.jar:4.3.7.Final] 
    at org.hibernate.loader.Loader.list(Loader.java:2365) ~[hibernate-core-4.3.7.Final.jar:4.3.7.Final] 
    at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:353) ~[hibernate-core-4.3.7.Final.jar:4.3.7.Final] 
    at org.hibernate.internal.SessionImpl.listCustomQuery(SessionImpl.java:1873) ~[hibernate-core-4.3.7.Final.jar:4.3.7.Final] 
    at org.hibernate.internal.AbstractSessionImpl.list(AbstractSessionImpl.java:311) ~[hibernate-core-4.3.7.Final.jar:4.3.7.Final] 
    at org.hibernate.internal.SQLQueryImpl.list(SQLQueryImpl.java:141) ~[hibernate-core-4.3.7.Final.jar:4.3.7.Final] 
    at org.hibernate.jpa.internal.QueryImpl.list(QueryImpl.java:573) ~[hibernate-entitymanager-4.3.7.Final.jar:4.3.7.Final] 
    at org.hibernate.jpa.internal.QueryImpl.getResultList(QueryImpl.java:449) ~[hibernate-entitymanager-4.3.7.Final.jar:4.3.7.Final] 

ответ

0

В Добавляющ некоторый столбец дискриминатора к моему SQL:

select 
    orig.*, 
    'test' as dtype 
from (
    ... orig sql 
) orig 

и изменяя Base на:

@Entity 
@DiscriminatorColumn(name = "dtype") 
public abstract class Base { ... } 

работает отлично.