【问题标题】:QueryHint "ResultSetType.ForwardOnly" fails with Spring JPA/EclipseLinkQueryHint“ResultSetType.ForwardOnly”因 Spring JPA/EclipseLink 而失败
【发布时间】:2011-07-15 08:44:45
【问题描述】:

设置时遇到问题

q.setHint(QueryHints.RESULT_SET_TYPE, ResultSetType.ForwardOnly);

用于 SQL 查询。我想使用这个提示,因为我期望一个大的结果集并且想要避免内存问题。我将 Spring JPA 与 EclipseLink 结合使用。堆栈跟踪是

Exception [EclipseLink-6057] (Eclipse Persistence Services - 1.1.0.r3634): org.eclipse.persistence.exceptions.QueryException  Exception Description: The method [getContainerClass()] is not a valid method to call on object [ScrollableCursorPolicy(page size = 10)].
org.eclipse.persistence.exceptions.QueryException.methodNotValid(QueryException.java:774)
org.eclipse.persistence.internal.queries.ContainerPolicy.getContainerClass(ContainerPolicy.java:477)
org.eclipse.persistence.internal.jpa.EJBQueryImpl.getResultList(EJBQueryImpl.java:558)
com.App.core.geo.JpaGeoDao.getAllGeoNames(JpaGeoDao.java:101)
com.App.core.geo.GeoEngineBeanImpl.createLuceneIndex(GeoEngineBeanImpl.java:67)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
java.lang.reflect.Method.invoke(Method.java:597)
org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:307)
org.springframework.osgi.service.importer.support.internal.aop.ServiceInvoker.doInvoke(ServiceInvoker.java:58)
org.springframework.osgi.service.importer.support.internal.aop.ServiceInvoker.invoke(ServiceInvoker.java:62)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:131)
org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:119)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
org.springframework.osgi.service.importer.support.LocalBundleContextAdvice.invoke(LocalBundleContextAdvice.java:59)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:131)
org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:119)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
$Proxy196.createLuceneIndex(Unknown Source)
com.App.core.main.beans.CachingBeanImpl.createTestActivityRate(CachingBeanImpl.java:512)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
java.lang.reflect.Method.invoke(Method.java:597)
org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:307)
org.springframework.osgi.service.importer.support.internal.aop.ServiceInvoker.doInvoke(ServiceInvoker.java:58)
org.springframework.osgi.service.importer.support.internal.aop.ServiceInvoker.invoke(ServiceInvoker.java:62)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:131)
org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:119)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
org.springframework.osgi.service.importer.support.LocalBundleContextAdvice.invoke(LocalBundleContextAdvice.java:59)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:131)
org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:119)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
$Proxy207.createTestActivityRate(Unknown Source)
com.App.core.webinterface.beans.BatchBeanImpl.createTestActivityRate(BatchBeanImpl.java:50)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
java.lang.reflect.Method.invoke(Method.java:597)
org.springframework.web.bind.annotation.support.HandlerMethodInvoker.doInvokeMethod(HandlerMethodInvoker.java:710)
org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:167)
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:414)
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:402)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:771)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:716)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:647)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:552)
javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

相关方法“getAllGeoNames”实现如下:

    public List<GeoName> getAllGeoNames() {

    Query q = jpaTemplate.getEntityManagerFactory().createEntityManager().createQuery("SELECT g FROM GeoName g");
    q.setHint(QueryHints.JDBC_FETCH_SIZE, 1000000);

    q.setHint(QueryHints.RESULT_SET_TYPE, ResultSetType.ForwardOnly);

    List<GeoName> result = q.getResultList();

    return result;
}

beans.xml 是:

<tx:annotation-driven />

<bean id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="appGeoPU" />
    <!-- <property name="dataSource" ref="dataSource" /> -->
    <property name="jpaVendorAdapter">
        <bean id="jpaVendorAdapter"
            class="org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter"
            p:databasePlatform="org.eclipse.persistence.platform.database.PostgreSQLPlatform"
            p:showSql="true" p:generateDdl="true" />
    </property>
    <property name="jpaDialect">
        <bean class="org.springframework.orm.jpa.vendor.EclipseLinkJpaDialect" />
    </property>
</bean>

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
    <property name="jpaDialect">
        <bean class="org.springframework.orm.jpa.vendor.EclipseLinkJpaDialect" />
    </property>
</bean>

<bean id="jpaTemplate" class="org.springframework.orm.jpa.JpaTemplate">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>

<bean id="geoDao" class="com.app.core.geo.JpaGeoDao">
    <property name="jpaTemplate" ref="jpaTemplate" />
</bean>

有人能帮我解决这个问题吗?

干杯, 史蒂芬

【问题讨论】:

    标签: spring postgresql jpa eclipselink


    【解决方案1】:

    您是否尝试过使用 getSingleResult 而不是 getResultList,因为您正在设置要返回的单个可滚动光标而不是 List。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-28
      • 1970-01-01
      • 2021-12-03
      • 2014-04-17
      • 2018-05-31
      • 1970-01-01
      • 2019-05-01
      相关资源
      最近更新 更多