问题描述
这是我的服务调用 findAll() 方法时不断收到的错误。当我使用本机查询“getSubmissionByCoreId”来检索数据时,我遇到了同样的错误。请注意,我可以使用“保存”方法成功插入到“提交”表中,没有任何问题:
org.springframework.dao.InvalidDataAccessResourceUsageException: Could not extract ResultSet; sql [n/a]; nested exception is org.hibernate.exception.sqlGrammarException: Could not extract ResultSet
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:259)
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:233)
at org.springframework.orm.jpa.AbstractEntityManagerfactorybean.translateExceptionIfPossible(AbstractEntityManagerfactorybean.java:551)
at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:61)
at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:242)
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:152)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:145)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:215)
at com.sun.proxy.$Proxy55.getSubmissionByCoreId(UnkNown Source)
at com.ibm.fda.splfhirpoc.audit.SubmissionService.getSubmissionByCoreId(SubmissionService.java:93)
at com.ibm.fda.splfhirpoc.audit.SubmissionService.updateSubmission(SubmissionService.java:160)
at com.ibm.fda.splfhirpoc.audit.SubmissionControllerNew.updateSubmission(SubmissionControllerNew.java:91)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.apache.cxf.service.invoker.AbstractInvoker.performInvocation(AbstractInvoker.java:179)
at org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:96)
at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:201)
at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:104)
at org.apache.cxf.interceptor.ServiceInvokerInterceptor$1.run(ServiceInvokerInterceptor.java:59)
at org.apache.cxf.interceptor.ServiceInvokerInterceptor.handleMessage(ServiceInvokerInterceptor.java:96)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308)
at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)
at org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:265)
at org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:234)
at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:208)
at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:160)
at org.apache.cxf.transport.servlet.CXFNonspringServlet.invoke(CXFNonspringServlet.java:225)
at org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:298)
at org.apache.cxf.transport.servlet.AbstractHTTPServlet.doPost(AbstractHTTPServlet.java:217)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:652)
at org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:273)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:687)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:346)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:887)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1684)
at org.apache.tomcat.util.net.socketProcessorBase.run(SocketProcessorBase.java:49)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.base/java.lang.Thread.run(Thread.java:836)
Caused by: org.hibernate.exception.sqlGrammarException: Could not extract ResultSet
at org.hibernate.exception.internal.sqlStateConversionDelegate.convert(sqlStateConversionDelegate.java:103)
at org.hibernate.exception.internal.StandardsqlExceptionConverter.convert(StandardsqlExceptionConverter.java:42)
at org.hibernate.engine.jdbc.spi.sqlExceptionHelper.convert(sqlExceptionHelper.java:113)
at org.hibernate.engine.jdbc.spi.sqlExceptionHelper.convert(sqlExceptionHelper.java:99)
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:67)
at org.hibernate.loader.Loader.getResultSet(Loader.java:2287)
at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:2045)
at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:2007)
at org.hibernate.loader.Loader.doQuery(Loader.java:953)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:354)
at org.hibernate.loader.Loader.doList(Loader.java:2810)
at org.hibernate.loader.Loader.doList(Loader.java:2792)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2624)
at org.hibernate.loader.Loader.list(Loader.java:2619)
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:506)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:396)
at org.hibernate.engine.query.spi.HQLQueryPlan.performlist(HQLQueryPlan.java:219)
at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1410)
at org.hibernate.query.internal.AbstractProducedQuery.doList(AbstractProducedQuery.java:1558)
at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1526)
at org.hibernate.query.internal.AbstractProducedQuery.getSingleResult(AbstractProducedQuery.java:1574)
at org.springframework.data.jpa.repository.query.JpaQueryExecution$SingleEntityExecution.doExecute(JpaQueryExecution.java:196)
at org.springframework.data.jpa.repository.query.JpaQueryExecution.execute(JpaQueryExecution.java:88)
at org.springframework.data.jpa.repository.query.AbstractJpaQuery.doExecute(AbstractJpaQuery.java:155)
at org.springframework.data.jpa.repository.query.AbstractJpaQuery.execute(AbstractJpaQuery.java:143)
at org.springframework.data.repository.core.support.RepositoryMethodInvoker$RepositoryQueryMethodInvoker$$Lambda$591/0x0000000000000000.invoke(UnkNown Source)
at org.springframework.data.repository.core.support.RepositoryMethodInvoker.doInvoke(RepositoryMethodInvoker.java:137)
at org.springframework.data.repository.core.support.RepositoryMethodInvoker.invoke(RepositoryMethodInvoker.java:121)
at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.doInvoke(QueryExecutorMethodInterceptor.java:152)
at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.invoke(QueryExecutorMethodInterceptor.java:131)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:80)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137)
... 53 more
Caused by: org.postgresql.util.PsqlException: ERROR: column submission0_1_.sub_id does not exist
Hint: Perhaps you meant to reference the column "submission0_.sub_id" or the column "submission0_1_.sps_id".
Position: 1302
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2553)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2285)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:323)
at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:473)
at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:393)
at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:164)
at org.postgresql.jdbc.PgPreparedStatement.executeQuery(PgPreparedStatement.java:114)
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:57)
... 86 more
这是我的实体类:
import java.io.Serializable;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OnetoMany;
import javax.persistence.SecondaryTable;
import javax.persistence.Table;
@Entity(name = "mysubmission")
@Table(name = "submission",schema = "splfhirpoc")
@SecondaryTable(name = "submission_processing_status",schema = "splfhirpoc")
public class SubmissionEntityTest implements Serializable {
private static final long serialVersionUID = 1L;
public static long getSerialversionuid() {
return serialVersionUID;
}
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "sub_id",updatable = false,nullable = false)
private Long subId ;
@Column(name = "sub_core_id",nullable = false)
private String subCoreId;
@Column(name = "sub_type_code",nullable = false)
private String subTypeCode ;
@Column(name = "sub_doc_type_code",nullable = false)
private String subDocTypeCode;
@Column(name = "sub_doc_type_text",nullable = false)
private String subDocTypeText ;
@Column(name = "sub_organization_duns_number",nullable = false)
private String subOrganizationDunsNumber ;
@Column(name = "sub_upload_timestamp",nullable = false)
private String subUploadTimestamp;
@Column(name = "sub_fhir_file_name")
private String subFhirFileName;
@Column(name = "sub_fhir_file_type")
private String subFhirFileType ;
@Column(name = "sub_fhir_file_url")
private String subFhirFileUrl;
@Column(name = "sub_fhir_bundle_id")
private String subFhirBundleId ;
@Column(name = "sub_fhir_version")
private String subFhirVersion;
@Column(name = "sub_fhir_transformed_timestamp")
private String subFhirTransformedTimestamp;
@Column(name = "sub_spl_set_id")
private String subSplSetId;
@Column(name = "sub_spl_doc_id")
private String subSplDocId ;
@Column(name = "sub_spl_file_name")
private String subSplFileName;
@Column(name = "sub_spl_file_type")
private String subSplFileType ;
@Column(name = "sub_spl_file_url")
private String subSplFileUrl;
@Column(name = "sub_spl_version")
private String subSplVersion;
@Column(name = "sub_spl_transformed_timestamp")
private String subSpltransformedTimestamp;
@Column(name = "sub_create_timestamp",nullable = false)
private String subCreateTimestamp;
@Column(name = "sub_update_timestamp")
private String subUpdateTimestamp;
@Column(name = "sub_created_by",nullable = false)
private String subCreatedBy;
@Column(name = "sub_updated_by")
private String subUpdatedBy;
@OnetoMany(mappedBy="submissionEntityTest",cascade=CascadeType.ALL)
private Set<SubmissionProcessingStatusEntityTest> subStatusList;
//Getter and Setter methods
}
这是我的存储库界面:
import java.util.List;
import java.util.Optional;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import com.ibm.fda.model.SubmissionEntityTest;
@Repository
@Transactional(timeout = 600)
public interface SubmissionRepositoryTest extends JpaRepository<SubmissionEntityTest,Long> {
List<SubmissionEntityTest> findAll();
Optional<SubmissionEntityTest> findById(long id);
@Query(" FROM mysubmission sub WHERE sub.subCoreId = :coreId ")
Optional<SubmissionEntityTest> getSubmissionByCoreId(@Param("coreId") String coreId);
}
这是服务类:
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.hibernate.HibernateException;
import org.hibernate.exception.ConstraintViolationException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.stereotype.Service;
import com.ibm.fda.model.AuditEvent;
import com.ibm.fda.model.SubmissionEntityTest;
import com.ibm.fda.model.SubmissionProcessingStatusEntityTest;
@Service
public class SubmissionService implements ISubmissionService {
private static final Logger LOGGER = LogManager.getLogger(SubmissionService.class.getName());
private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
private SubmissionEntityTest submission = new SubmissionEntitytest();
private SubmissionEntityTest outSubmission = new SubmissionEntitytest();
private SubmissionProcessingStatusEntityTest outSpsSubmission = new SubmissionProcessingStatusEntitytest();
private SubmissionProcessingStatusEntityTest spsSubmission = new SubmissionProcessingStatusEntitytest();
@Autowired
private SubmissionRepositoryTest submissionRepositoryTest;
@Autowired
private SubmissionProcessingStatusRepository submissionProcessingStatusRepository;
@Override
public List<SubmissionEntityTest> getAllSubmissions() throws ResourceNotFoundException {
LOGGER.trace("Received getAllSubmissions request");
try {
Iterable<SubmissionEntityTest> it = submissionRepositoryTest.findAll();
ArrayList<SubmissionEntityTest> submissions = new ArrayList<SubmissionEntityTest>();
it.forEach(e -> submissions.add(e));
return submissions;
}
catch (ConstraintViolationException ce)
{
ce.printstacktrace();
System.out.println(" ConstraintViolation exception when trying to retrieve all submissions : " + ce.getMessage());
throw new RuntimeException(ce);
}
catch (HibernateException he)
{
he.printstacktrace();
System.out.println(" Hibernate exception when trying to retrieve all submissions : " + he.getMessage());
throw new RuntimeException(he);
}
catch (DataAccessException de) {
de.printstacktrace();
System.out.println(" Data Access exception when trying to retrieve all submissions : " + de.getMessage());
throw new RuntimeException(de);
}
}
这是我的控制器类:
import java.util.List;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.HeaderParam;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import com.ibm.fda.model.AuditEvent;
import com.ibm.fda.model.SubmissionEntityTest;
@Path("/submission")
public class SubmissionControllerNew {
private static final Logger LOGGER = LogManager.getLogger(SubmissionControllerNew.class.getName());
@Autowired
private ISubmissionService submissionService;
@GET
@Path("getAll")
@Produces(MediaType.APPLICATION_JSON)
public List<SubmissionEntityTest> getAllSubmissions(@HeaderParam("userID") String userID,@HeaderParam("org") String org) throws ResourceNotFoundException {
List<SubmissionEntityTest> list = submissionService.getAllSubmissions();
LOGGER.trace("Received getAllSubmissions request");
return list;
}
....和我的 application.properties
spring.datasource.driver-class-name=org.postgresql.Driver
spring.datasource.initialization-mode=always
spring.datasource.url=jdbc:postgresql://localhost:9001/fhirdb
spring.datasource.username=
spring.datasource.password=
spring.jpa.show-sql=true
# Hibernate Properties
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgresqlDialect
# Hibernate ddl auto (create,create-drop,validate,update)
spring.jpa.hibernate.ddl-auto=none
spring.jpa.properties.hibernate.default_schema=splfhirpoc
spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true
spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaimpl
#
spring.jpa.properties.hibernate.show_sql=true
spring.jpa.properties.hibernate.use_sql_comments=true
spring.jpa.properties.hibernate.format_sql=true
最后,Postgres 表在“splfhirpoc”模式中具有以下布局:
Create table splfhirpoc.submission (
sub_id serial not null primary key,sub_core_id varchar(100) not null,sub_type_code varchar(10) not null,sub_doc_type_code varchar(20) not null,sub_doc_type_text varchar(100) not null,sub_organization_duns_number varchar(100) not null,sub_upload_timestamp varchar(50) not null,sub_fhir_file_name varchar(250),sub_fhir_file_type varchar(10),sub_fhir_file_url varchar(250),sub_fhir_bundle_id varchar(100),sub_fhir_version varchar(10),sub_fhir_transformed_timestamp varchar(50),sub_spl_set_id varchar(100) not null,sub_spl_doc_id varchar(100) not null,sub_spl_file_name varchar(250),sub_spl_file_type varchar(10),sub_spl_file_url varchar(250),sub_spl_version varchar(10),sub_spl_transformed_timestamp varchar(50),sub_create_timestamp varchar(50) not null,sub_update_timestamp varchar(50),sub_created_by varchar(100) not null,sub_updated_by varchar(100)
)
解决方法
“这是我的存储库接口”在这里您不需要放置 findAll() 方法。 JpaRepo 将为您提供实现。
您的存储库应如下所示:
import java.util.List;
import java.util.Optional;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import com.ibm.fda.model.SubmissionEntityTest;
@Repository
@Transactional(timeout = 600)
public interface SubmissionRepositoryTest extends JpaRepository<SubmissionEntityTest,Long> {
@Query(" FROM mysubmission sub WHERE sub.subCoreId = :coreId ")
Optional<SubmissionEntityTest> getSubmissionByCoreId(@Param("coreId") String coreId);
}
此处应仅显示您的自定义 Jpa 查询。