it-swarm.com.de

konnte ResultSet im Ruhezustand nicht extrahieren

Ich habe ein Problem in Hibernate . Ich versuche zu List zu parsen, aber es gibt eine Ausnahme: HTTP Status 500 - could not extract ResultSet. Wenn ich debugge, ist es ein Fehler in der Zeile query.list() .. 

Mein Beispielcode hier

@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;
}

}

Meine Bohnen

  <!-- 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"/>

Ausnahme:

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)

Meine Datenbank:

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
)
42
Thanh Duy Ngo

Die Annotation @JoinColumn gibt den Namen der Spalte an, die als Fremdschlüssel für die Zieleinheit verwendet wird. 

In der Product-Klasse oben ist der Name der Join-Spalte auf ID_CATALOG festgelegt.

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

Der Fremdschlüssel in der Product-Tabelle heißt jedoch catalog_id

`catalog_id` int(11) DEFAULT NULL,

Sie müssen entweder den Spaltennamen in der Tabelle oder den Namen, den Sie in @JoinColumn verwenden, ändern, damit sie übereinstimmen. Siehe http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html/entity.html#entity-mapping-association

49
Will Keeling

Eine andere mögliche Ursache für andere Personen, die dieselbe Fehlermeldung erhalten, ist, dass dieser Fehler auftritt, wenn Sie auf eine Tabelle in einem anderen Schema als demjenigen zugreifen, mit dem Sie sich authentifiziert haben.

In diesem Fall müssen Sie den Schemanamen zu Ihrem Entitätseintrag hinzufügen:

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

Versuchen Sie es mit innerem Join in Ihrer Abfrage

    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();

auch in der hibernate config datei haben 

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

Um anzuzeigen, was auf der Konsole abgefragt wird.

4
Lakshmi

Ich hatte ein ähnliches Problem. Verwenden Sie den HQL-Editor. Es wird Ihnen die SQL angezeigt (da Sie eine SQL-Grammatik-Ausnahme haben). Kopieren Sie Ihre SQL und führen Sie sie separat aus. In meinem Fall lag das Problem in der Schemadefinition. Ich habe das Schema definiert, aber ich sollte es leer lassen. Dies hat die gleiche Ausnahme ausgelöst wie Sie. Die Fehlerbeschreibung spiegelte den tatsächlichen Status wider, da der Schemaname in der SQL-Anweisung enthalten war. 

2
Gico

Wenn Sie nicht die 'HIBERNATE_SEQUENCE'-Sequenz in der Datenbank erstellt haben (wenn Sie Oracle oder eine sequenzbasierte Datenbank verwenden), erhalten Sie den gleichen Fehler.

Stellen Sie sicher, dass die Sequenz dort vorhanden ist.

Das gleiche Problem hatte ich nach der Migration einer Datenbank vom Online-Server zu Localhost. Das Schema wurde geändert, sodass ich das Schema für jede Tabelle manuell definieren musste:

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

Eine andere Lösung ist @JsonIgnore hinzufügen:

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