source

최대 절전 모드에서 결과 집합을 추출할 수 없습니다.

lovecheck 2022. 12. 18. 08:39
반응형

최대 절전 모드에서 결과 집합을 추출할 수 없습니다.

휴지 상태에 문제가 있다.List로 해석하려고 하는데 예외가 발생합니다.HTTP Status 500 - could not extract ResultSet디버깅을 하면 라인에서 장애가 발생한다.query.list()...

여기 샘플 코드

@Entity
@Table(name = "catalog")
public class Catalog implements Serializable {

@Id
@Column(name="ID_CATALOG")
@GeneratedValue 
private Integer idCatalog;

@Column(name="Catalog_Name")
private String catalogName;

@OneToMany(mappedBy="catalog", fetch = FetchType.LAZY)
private Set<Product> products = new HashSet<Product>(0);

//getter & setter & constructor
//...
}


@Entity
@Table(name = "product")
public class Product implements Serializable {

@Id
@Column(name="id_product")
@GeneratedValue 
private Integer idProduct;

@ManyToOne
@JoinColumn(name="ID_CATALOG")
private Catalog catalog;

@Column(name="product_name")
private String productName;

@Column(name="date")
private Date date;

@Column(name="author")
private String author;

@Column(name="price")
private Integer price;

@Column(name="linkimage")
private String linkimage;

//getter & setter & constructor
}



@Repository
@SuppressWarnings({"unchecked", "rawtypes"})
public class ProductDAOImpl implements ProductDAO {
    @Autowired
    private SessionFactory sessionFactory;
public List<Product> searchProductByCatalog(String catalogid, String keyword) {
    String sql = "select p from Product p where 1 = 1";
    Session session = sessionFactory.getCurrentSession();

    if (keyword.trim().equals("") == false) {
        sql += " and p.productName like '%" + keyword + "%'";
    }
    if (catalogid.trim().equals("-1") == false
            && catalogid.trim().equals("") == false) {
        sql += " and p.catalog.idCatalog = " + Integer.parseInt(catalogid);
    }
    Query query = session.createQuery(sql);
    List listProduct = query.list();
    return listProduct;
}

}

내 콩

  <!-- Scan classpath for annotations (eg: @Service, @Repository etc) -->
  <context:component-scan base-package="com.shopmvc"/>

  <!-- JDBC Data Source. It is assumed you have MySQL running on localhost port 3306 with 
       username root and blank password. Change below if it's not the case -->
  <bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/shoesshopdb?autoReconnect=true"/>
    <property name="username" value="root"/>
    <property name="password" value="12345"/>
    <property name="validationQuery" value="SELECT 1"/>
  </bean>

  <!-- Hibernate Session Factory -->
  <bean id="mySessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="myDataSource"/>
    <property name="packagesToScan">
      <array>
        <value>com.shopmvc.pojo</value>
      </array>
    </property>
    <property name="hibernateProperties">
      <value>
        hibernate.dialect=org.hibernate.dialect.MySQLDialect
      </value>
    </property>
  </bean>

  <!-- Hibernate Transaction Manager -->
  <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory" ref="mySessionFactory"/>
  </bean>

  <!-- Activates annotation based transaction management -->
  <tx:annotation-driven transaction-manager="transactionManager"/>

예외:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:948)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:827)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728)

root cause 

org.hibernate.exception.SQLGrammarException: could not extract ResultSet
    org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:82)
    org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49)
    org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125)
    org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110)
    org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:61)
    org.hibernate.loader.Loader.getResultSet(Loader.java:2036)

root cause 

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'product0_.ID_CATALOG' in 'field list'
    sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    java.lang.reflect.Constructor.newInstance(Unknown Source)
    com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
    com.mysql.jdbc.Util.getInstance(Util.java:386)
    com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1054)
    com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4187)
    com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4119)
    com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2570)
    com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2731)
    com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2815)
    com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155)
    com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2322)
    org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96)
    org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96)
    org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:56)
    org.hibernate.loader.Loader.getResultSet(Loader.java:2036)
    org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1836)
    org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1815)
    org.hibernate.loader.Loader.doQuery(Loader.java:899)
    org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:341)
    org.hibernate.loader.Loader.doList(Loader.java:2522)
    org.hibernate.loader.Loader.doList(Loader.java:2508)
    org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2338)
    org.hibernate.loader.Loader.list(Loader.java:2333)
    org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:490)

내 데이터베이스:

CREATE TABLE `catalog` (
  `ID_CATALOG` int(11) NOT NULL AUTO_INCREMENT,
  `Catalog_Name` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`ID_CATALOG`)
)

CREATE TABLE `product` (
  `id_product` int(11) NOT NULL AUTO_INCREMENT,
  `product_name` varchar(45) DEFAULT NULL,
  `date` date DEFAULT NULL,
  `author` varchar(45) DEFAULT NULL,
  `price` int(11) DEFAULT NULL,
  `catalog_id` int(11) DEFAULT NULL,
  `linkimage` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`id_product`),
  KEY `FK_Product_idx` (`catalog_id`),
  CONSTRAINT `FK_Product` FOREIGN KEY (`catalog_id`) REFERENCES `catalog` (`ID_CATALOG`) ON DELETE NO ACTION ON UPDATE NO ACTION
)

@JoinColumnannotation은 대상 엔티티에서 외부 키로 사용되는 열의 이름을 지정합니다.

에서Product위의 클래스에서 조인 열의 이름은 다음과 같이 설정됩니다.ID_CATALOG.

@ManyToOne
@JoinColumn(name="ID_CATALOG")
private Catalog catalog;

단, 의 외부 키는Product테이블이 호출됩니다.catalog_id

`catalog_id` int(11) DEFAULT NULL,

테이블의 열 이름 또는 에서 사용 중인 이름을 변경해야 합니다.@JoinColumn잘 어울리도록.http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html/entity.html#entity-mapping-association 를 참조해 주세요.

또 다른 원인으로서는, 같은 에러 메세지가 표시되는 다른 유저에게 있어서, 인증한 스키마와는 다른 스키마내의 테이블에 액세스 하고 있는 경우에, 이 에러가 발생하는 것을 생각할 수 있습니다.

이 경우 엔티티 엔트리에 스키마 이름을 추가해야 합니다.

@Table(name= "catalog", schema = "targetSchemaName")

행을 업데이트하려고 했을 때도 같은 문제가 발생했습니다.

@Query(value = "UPDATE data SET value = 'asdf'", nativeQuery = true)
void setValue();

나의 문제점은 내가 깜빡 잊고 추가하지 않았다는 것이다.@Modifying주석:

@Modifying    
@Query(value = "UPDATE data SET value = 'asdf'", nativeQuery = true)
void setValue();

데이터베이스에 'HIBERNATE_SEQUENCE' 시퀀스가 작성되지 않은 경우(Oracle 또는 시퀀스 기반 데이터베이스를 사용하는 경우) 동일한 유형의 오류가 발생합니다.

시퀀스가 존재하는 것을 확인합니다.

application.properties 파일에서 다음 속성을 사용했더니 문제가 해결되었습니다.

spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl

그리고.

spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

아까는 에러가 나고 있었다

There was an unexpected error (type=Internal Server Error, status=500).
could not extract ResultSet; SQL [n/a]; nested exception is 
org.hibernate.exception.SQLGrammarException: could not extract ResultSet
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:280)
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:254)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:528)
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:153)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)

쿼리에서 내부 결합을 사용해 보십시오.

    Query query=session.createQuery("from Product as p INNER JOIN p.catalog as c 
    WHERE c.idCatalog= :id and p.productName like :XXX");
    query.setParameter("id", 7);
    query.setParameter("xxx", "%"+abc+"%");
    List list = query.list();

또한 휴지 상태 설정 파일에는

<!--hibernate.cfg.xml -->
<property name="show_sql">true</property>

콘솔에서 쿼리 중인 내용을 표시합니다.

저도 비슷한 문제가 있었어요.HQL 에디터를 사용해 보겠습니다.SQL 문법 예외가 있는 것처럼 SQL이 표시됩니다.SQL을 복사하여 별도로 실행합니다.내 경우 스키마의 정의에 문제가 있었다.스키마를 정의했지만 비워 두어야 합니다.이로 인해 당신이 받은 것과 같은 예외가 발생했습니다.또한 SQL 문에 스키마 이름이 포함되었기 때문에 오류 설명은 실제 상태를 반영했습니다.

데이터베이스를 온라인 서버에서 로컬 호스트로 마이그레이션한 후 동일한 문제에 직면했습니다.스키마가 변경되어 각 테이블에 대해 스키마를 수동으로 정의해야 했습니다.

@Entity
@Table(name = "ESBCORE_DOMAIN", schema = "SYS")

MySqlcamelcase를 쓰는 것이 좋지 않다는 것을 명심하십시오.예를 들어 스키마가 이와 같은 경우:

CREATE TABLE IF NOT EXISTS `task`(
    `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
    `teaching_hours` DECIMAL(5,2) DEFAULT NULL,
    `isActive` BOOLEAN DEFAULT FALSE,
    `is_validated` BOOLEAN DEFAULT FALSE,
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

하지 안 된다isActive 하면 '열'이 '열은 열로 변환됩니다.isactive엔티티 클래스는 다음과 같습니다.

 @Basic
 @Column(name = "isactive", nullable = true)
 public boolean isActive() {
     return isActive;
 }
 public void setActive(boolean active) {
     isActive = active;
 }

그게 내 문제였으니까 네 실수라도 했겠지

이는 대소문자를 구분하지 않는 MySql과는 관계가 없으며, 스프링이 테이블을 변환하기 위해 사용하는 명명 전략입니다.상세한 것에 대하여는, 투고를 참조해 주세요.

PostgreSql에서 Spring Data JPA를 사용하고 있었는데 UPDATE 호출 중에 오류가 발생했습니다.

  • '결과 집합을 추출할 수 없습니다.' 및 다른 결과 집합을 추출할 수 없습니다.
  • org.springframework.dao 입니다.잘못된 DataAccessApiUsageException:업데이트/삭제 쿼리를 실행합니다.네스트된 예외는 javax.persistence입니다.TransactionRequiredException:업데이트/삭제 쿼리 실행(트랜잭션을 표시해야 함)

사실, 두 개의 필수 주석이 누락되어 있었습니다.

  • @트랜잭션 및
  • @변경 중

포함...

@Query(vlaue = " UPDATE DB.TABLE SET Col1 = ?1 WHERE id = ?2 ", nativeQuery = true)
void updateCol1(String value, long id);

다른 솔루션은 add @JsonIgnore 입니다.

@OneToMany(mappedBy="catalog", fetch = FetchType.LAZY)
@JsonIgnore
private Set<Product> products = new HashSet<Product>(0);

이 메시지는 테이블(https://dev.mysql.com/doc/refman/8.0/en/keywords.html#keywords-8-0-detailed-C))에서 실수로 예약 키워드를 사용한 경우에도 표시됩니다.sama라는 이름이 reserved mysql 키워드로 되어 있는 테이블에서 Join을 실행해도 같은 메시지가 나타납니다.다만, 그 이외의 내용은 모두 올바릅니다.이것이 다른 사람들을 위해 시간과 고통을 덜어주기를 바란다.

유사한 문제를 재현했습니다.

Caused by: 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:279)
    at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:253)
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:527)
    at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:61)
    at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:242)

...

Caused by: java.sql.SQLSyntaxErrorException: Unknown column 'setting0_.advance_payment_first_text' in 'field list'
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)
    at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
    at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:975)
    

제 와 "Dump"의 입니다.liquibase '''data.xml이치노

<changeSet  author="liquibase-docs"  id="sqlFile-data">
        <sqlFile  dbms="!h2, oracle, mysql"
                  encoding="UTF-8"
                  path="..\..\..\sql\data.sql"
                  relativeToChangelogFile="true"
                  splitStatements="true"
                  stripComments="true"/>
</changeSet>

★★★★★★★★★★★★★★★★★」structure.xml:

<changeSet  author="liquibase-docs"  id="sqlFile-structure">
        <sqlFile  dbms="!h2, oracle, mysql"
                  encoding="UTF-8"
                  path="..\..\..\sql\structure.sql"
                  relativeToChangelogFile="true"
                  splitStatements="true"
                  stripComments="true"/>
</changeSet>

프로젝트의 오래된 스크립트에 사용합니다.

코드 내의 컬럼이 있는 테이블의 대응성을 확인하면서 몇 가지 조사를 한 결과 프로젝트 신규 덤프를 실행한 후 이 오래된 스크립트 오버로트를 이해했습니다.

스크립트 후data.sql ★★★★★★★★★★★★★★★★★」structure.sql " " " 를 data.xml ★★★★★★★★★★★★★★★★★」structure.xml프로젝트를 통해 이 문제가 해결되었습니다.

언급URL : https://stackoverflow.com/questions/20089031/could-not-extract-resultset-in-hibernate

반응형