복붙노트

[SQL] 최대 절전 모드에서의 ResultSet을 추출 할 수

SQL

최대 절전 모드에서의 ResultSet을 추출 할 수

나는 최대 절전 모드에 문제가 있습니다. 나는 목록에 구문 분석하려고하지만 그것은 예외가 발생합니다 : HTTP 상태 500 - 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
)

해결법

  1. ==============================

    1.@JoinColumn 주석 지정은 컬럼의 이름은 대상 기업에 대한 외부 키로 사용된다.

    @JoinColumn 주석 지정은 컬럼의 이름은 대상 기업에 대한 외부 키로 사용된다.

    위의 제품 클래스에서의 이름은 열이 ID_CATALOG로 설정되어 가입 할 수 있습니다.

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

    그러나, 제품 테이블에 외래 키가 호출 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 참조

  2. ==============================

    2.다른 사람이 같은 오류 메시지를 통해 오는 또 다른 잠재적 인 원인은, 당신은 당신이 인증 한 것과 다른 스키마에서 테이블을 액세스하는 경우이 오류가 발생할 것입니다.

    다른 사람이 같은 오류 메시지를 통해 오는 또 다른 잠재적 인 원인은, 당신은 당신이 인증 한 것과 다른 스키마에서 테이블을 액세스하는 경우이 오류가 발생할 것입니다.

    이 경우 당신은 당신의 엔티티 항목에 스키마 이름을 추가해야합니다 :

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

    3.귀하의 질의에 가입 내부 사용해보십시오

    귀하의 질의에 가입 내부 사용해보십시오

        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>
    

    콘솔에 조회되는 것을 표시합니다.

  4. ==============================

    4.나는 비슷한 문제를 가지고 있었다. HQL 편집기를 사용하십시오. (당신이 SQL 문법의 예외를 가지고)이 당신에게 SQL을 표시합니다. 당신의 SQL을 복사하고 별도로 실행합니다. 내 경우에는 문제는 스키마 정의했다. 나는 스키마 정의,하지만 난 그것을 비워 두어야합니다. 당신이있어 이것은 같은 예외를 올렸다. 스키마 이름이 SQL 문에 포함되면서 에러 설명, 실제 상태를 반영합니다.

    나는 비슷한 문제를 가지고 있었다. HQL 편집기를 사용하십시오. (당신이 SQL 문법의 예외를 가지고)이 당신에게 SQL을 표시합니다. 당신의 SQL을 복사하고 별도로 실행합니다. 내 경우에는 문제는 스키마 정의했다. 나는 스키마 정의,하지만 난 그것을 비워 두어야합니다. 당신이있어 이것은 같은 예외를 올렸다. 스키마 이름이 SQL 문에 포함되면서 에러 설명, 실제 상태를 반영합니다.

  5. ==============================

    5.당신은 (사용 신탁 또는 순서 기반 데이터베이스가있는 경우), 당신은 오류의 동일한 유형을 얻을 것이다 데이터베이스에서 만든 'HIBERNATE_SEQUENCE'순서가없는 경우;

    당신은 (사용 신탁 또는 순서 기반 데이터베이스가있는 경우), 당신은 오류의 동일한 유형을 얻을 것이다 데이터베이스에서 만든 'HIBERNATE_SEQUENCE'순서가없는 경우;

    시퀀스가 존재 확인;

  6. ==============================

    6.내가 행을 업데이트하려고 동일한 문제가 있었다 :

    내가 행을 업데이트하려고 동일한 문제가 있었다 :

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

    내 문제는 내가 @Modifying 주석을 추가하는 것을 잊었다했다 :

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

    7.나는 로컬 호스트 온라인 서버에서 데이터베이스를 마이그레이션 한 후 같은 문제에 직면했다. I 있도록 변경 스키마는 각 테이블에 대해 수동으로 스키마를 정의했다 :

    나는 로컬 호스트 온라인 서버에서 데이터베이스를 마이그레이션 한 후 같은 문제에 직면했다. I 있도록 변경 스키마는 각 테이블에 대해 수동으로 스키마를 정의했다 :

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

    8.내 application.properties 파일에 다음과 같은 속성을 사용하여 문제가 해결되었다

    내 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)
    
  9. ==============================

    9.또 다른 해결책은 추가 @JsonIgnore입니다 :

    또 다른 해결책은 추가 @JsonIgnore입니다 :

    @OneToMany(mappedBy="catalog", fetch = FetchType.LAZY)
    @JsonIgnore
    private Set<Product> products = new HashSet<Product>(0);
    
  10. from https://stackoverflow.com/questions/20089031/could-not-extract-resultset-in-hibernate by cc-by-sa and MIT license