【问题标题】:Hibernate exception for native query本机查询的休眠异常
【发布时间】:2012-03-29 15:36:31
【问题描述】:

我有一个获取大量数据的 Hiberante 原生查询。到现在为止,它一直没有打嗝,但由于某些特定数据的原因,我得到了下面给出的例外。我应该如何尝试找出原因?

我的本​​机查询格式为:

    Query query = entityManager.createNativeQuery(sql);
    query.setParameter(1, foo);
    List<Object[]> results = query.getResultList();

实际查询由两个内连接、多个左外连接、一个 where 条件和三列的 order by 组成。它没有对 sql 函数的任何调用。它确实使用索引,因为它是一个大查询。这个问题发生在 Hibernate 4 beta 5 和 4.1.1 中,使用 MySQL 5.5

还有其他查询,但异常与为该本机查询调用 query.getResultList 的时刻直接相关。会不会是 Hibernate 还强制执行其他一些查询(因为懒惰或其他原因?)

Caused by: java.lang.NullPointerException
    at org.hibernate.engine.jdbc.internal.proxy.ResultSetProxyHandler.getJdbcServices(ResultSetProxyHandler.java:57) [hibernate-core-4.0.0.Beta5.jar:4.0.0.Beta5]
    at org.hibernate.engine.jdbc.internal.proxy.AbstractResultSetProxyHandler.continueInvocation(AbstractResultSetProxyHandler.java:110) [hibernate-core-4.0.0.Beta5.jar:4.0.0.Beta5]
    at org.hibernate.engine.jdbc.internal.proxy.AbstractProxyHandler.invoke(AbstractProxyHandler.java:80) [hibernate-core-4.0.0.Beta5.jar:4.0.0.Beta5]
    at $Proxy305.wasNull(Unknown Source)    at org.hibernate.type.descriptor.sql.BasicExtractor.extract(BasicExtractor.java:66) [hibernate-core-4.0.0.Beta5.jar:4.0.0.Beta5]
    at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:269) [hibernate-core-4.0.0.Beta5.jar:4.0.0.Beta5]
    at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:265) [hibernate-core-4.0.0.Beta5.jar:4.0.0.Beta5]
    at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:243) [hibernate-core-4.0.0.Beta5.jar:4.0.0.Beta5]
    at org.hibernate.loader.custom.CustomLoader$ScalarResultColumnProcessor.extract(CustomLoader.java:549) [hibernate-core-4.0.0.Beta5.jar:4.0.0.Beta5]
    at org.hibernate.loader.custom.CustomLoader$ResultRowProcessor.buildResultRow(CustomLoader.java:499) [hibernate-core-4.0.0.Beta5.jar:4.0.0.Beta5]
    at org.hibernate.loader.custom.CustomLoader$ResultRowProcessor.buildResultRow(CustomLoader.java:478) [hibernate-core-4.0.0.Beta5.jar:4.0.0.Beta5]
    at org.hibernate.loader.custom.CustomLoader.getResultColumnOrRow(CustomLoader.java:375) [hibernate-core-4.0.0.Beta5.jar:4.0.0.Beta5]
    at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:668) [hibernate-core-4.0.0.Beta5.jar:4.0.0.Beta5]
    at org.hibernate.loader.Loader.doQuery(Loader.java:860) [hibernate-core-4.0.0.Beta5.jar:4.0.0.Beta5]
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:289) [hibernate-core-4.0.0.Beta5.jar:4.0.0.Beta5]
    at org.hibernate.loader.Loader.doList(Loader.java:2449) [hibernate-core-4.0.0.Beta5.jar:4.0.0.Beta5]
    at org.hibernate.loader.Loader.doList(Loader.java:2435) [hibernate-core-4.0.0.Beta5.jar:4.0.0.Beta5]
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2276) [hibernate-core-4.0.0.Beta5.jar:4.0.0.Beta5]
    at org.hibernate.loader.Loader.list(Loader.java:2271) [hibernate-core-4.0.0.Beta5.jar:4.0.0.Beta5]
    at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:331) [hibernate-core-4.0.0.Beta5.jar:4.0.0.Beta5]
    at org.hibernate.internal.SessionImpl.listCustomQuery(SessionImpl.java:1571) [hibernate-core-4.0.0.Beta5.jar:4.0.0.Beta5]
    at org.hibernate.internal.AbstractSessionImpl.list(AbstractSessionImpl.java:224) [hibernate-core-4.0.0.Beta5.jar:4.0.0.Beta5]
    at org.hibernate.internal.SQLQueryImpl.list(SQLQueryImpl.java:156) [hibernate-core-4.0.0.Beta5.jar:4.0.0.Beta5]
    at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:252) [hibernate-entitymanager-4.0.0.Beta5.jar:4.0.0.Beta5]
    at com.foo.bar.getResults(MyResultHandler.java:114) [classes:]
    at sun.reflect.GeneratedMethodAccessor16978.invoke(Unknown Source) [:1.7.0]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [:1.7.0]
    at java.lang.reflect.Method.invoke(Method.java:601) [:1.7.0]
    at org.jboss.as.ee.component.ManagedReferenceMethodInterceptor.processInvocation(ManagedReferenceMethodInterceptor.java:51)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:287) [jboss-invocation-1.1.0.Final.jar:1.1.0.Final]
    at org.jboss.invocation.InterceptorContext$Invocation.proceed(InterceptorContext.java:370) [jboss-invocation-1.1.0.Final.jar:1.1.0.Final]
    at org.jboss.as.weld.ejb.Jsr299BindingsInterceptor.doMethodInterception(Jsr299BindingsInterceptor.java:114) [jboss-as-weld-7.0.1.Final.jar:7.0.1.Final]
    at org.jboss.as.weld.ejb.Jsr299BindingsInterceptor.processInvocation(Jsr299BindingsInterceptor.java:122) [jboss-as-weld-7.0.1.Final.jar:7.0.1.Final]
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:287) [jboss-invocation-1.1.0.Final.jar:1.1.0.Final]
    at org.jboss.invocation.WeavedInterceptor.processInvocation(WeavedInterceptor.java:53) [jboss-invocation-1.1.0.Final.jar:1.1.0.Final]
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:287) [jboss-invocation-1.1.0.Final.jar:1.1.0.Final]
    at org.jboss.as.jpa.interceptor.SBInvocationInterceptor.processInvocation(SBInvocationInterceptor.java:45) [jboss-as-jpa-7.0.1.Final.jar:7.0.1.Final]
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:287) [jboss-invocation-1.1.0.Final.jar:1.1.0.Final]
    at org.jboss.as.ejb3.component.stateful.StatefulSessionSynchronizationInterceptor.processInvocation(StatefulSessionSynchronizationInterceptor.java:132)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:287) [jboss-invocation-1.1.0.Final.jar:1.1.0.Final]
    at org.jboss.as.ee.component.NamespaceContextInterceptor.processInvocation(NamespaceContextInterceptor.java:44)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:287) [jboss-invocation-1.1.0.Final.jar:1.1.0.Final]
    at org.jboss.as.ee.component.TCCLInterceptor.processInvocation(TCCLInterceptor.java:45)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:287) [jboss-invocation-1.1.0.Final.jar:1.1.0.Final]
    at org.jboss.invocation.InitialInterceptor.processInvocation(InitialInterceptor.java:21) [jboss-invocation-1.1.0.Final.jar:1.1.0.Final]
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:287) [jboss-invocation-1.1.0.Final.jar:1.1.0.Final]
    at org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:61) [jboss-invocation-1.1.0.Final.jar:1.1.0.Final]
    at org.jboss.as.ee.component.ViewDescription$ComponentDispatcherInterceptor.processInvocation(ViewDescription.java:202)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:287) [jboss-invocation-1.1.0.Final.jar:1.1.0.Final]
    at org.jboss.as.jpa.interceptor.SFSBInvocationInterceptor.processInvocation(SFSBInvocationInterceptor.java:58) [jboss-as-jpa-7.0.1.Final.jar:7.0.1.Final]
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:287) [jboss-invocation-1.1.0.Final.jar:1.1.0.Final]
    at org.jboss.as.ejb3.component.stateful.StatefulComponentInstanceInterceptor.processInvocation(StatefulComponentInstanceInterceptor.java:61)
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:287) [jboss-invocation-1.1.0.Final.jar:1.1.0.Final]
    at org.jboss.as.ejb3.component.session.SessionInvocationContextInterceptor$CustomSessionInvocationContext.proceed(SessionInvocationContextInterceptor.java:126)
    at org.jboss.ejb3.tx2.impl.CMTTxInterceptor.invokeInCallerTx(CMTTxInterceptor.java:233)
    ... 93 more

【问题讨论】:

    标签: mysql hibernate


    【解决方案1】:

    您可能期望来自可空列的原语。

    Hibernate 使用反射来创建对象。

    public class A {
        private long id;
    
        private int n;
    
        public void setN(int n) { this.n = n; }
        public int getN() { return this.n; }
    
        // id
    }
    

    如果您使用DAO.get(id, A.class) 检索A 对象,它将像这样安装:

    select a_.id, a_.n from A a_ where a_id = ? /* Where ? is the id */
    

    然后它会这样做(注意,这只是为了说明我的例子):

    A a = new A();
    
    a.setId([a_.id])
    a.setN([a_.n])
    

    如果检索两行:

    id     n
     1     1
     2     NULL
    

    它会尝试实例化一个A 对象并将其n 属性设置为setN(null)。由于签名是原语,这会引发错误。

    查看表描述以查看是否有任何可为空的列。如果是这样,请在 setter 中寻找不期望任何原语。

    这意味着当hibernate 执行setPrimitive(null) // signature setPrimitive(long l) 失败。

    【讨论】:

    • 您能详细说明一下吗?我应该如何进一步调查?我不明白我在哪里期待一个原始人。
    猜你喜欢
    • 1970-01-01
    • 2014-08-08
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 2011-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多