获取SqlGrammarException

时间:2019-01-07 12:31:52

标签: hibernate

当使用Session从数据库中删除时,Hibernate提供sqlgrammarexception。它表明hibernate在delete语句中缺少“ from”,因为delete语句应该从tablename中删除,其中column =?但是它显示为删除表名,其中column =?。我只想使用hibernate从数据库中删除一条上述记录,我使用Spring验证了用户名和密码,如果用户名密码正确,则使用hibernate从数据库中删除用户/记录。

尝试使用session.delete(a)方法。

protected void doPost(HttpServletRequest request, HttpServletResponse 
response) throws ServletException, IOException {
    doGet(request, response);
    PrintWriter out = response.getWriter();
    String u = request.getParameter("uname");
    String p = request.getParameter("pwd");
    String em = request.getParameter("email");
    ConfigurableApplicationContext ctx=new 
    ClassPathXmlApplicationContext("applicationContext.xml");
    APTECHDAO dao=(APTECHDAO)ctx.getBean("apt");
    List<APTECH> list=dao.getAllAPTECH();  
    int flag = 0;
    for(APTECH g:list) {
        if(u.equals(g.USERNAME) && p.equals(g.PASSWORD)) {
            flag=1;
            ((ConfigurableApplicationContext)ctx).close();
            list.clear();
            //dao).close();
            break;
        }
        else {
            flag=0;
        }
    }
    if(flag==1) {   
        Configuration cfg = new Configuration();
        cfg.configure("hibernate.cfg.xml"); 
        SessionFactory factory = cfg.buildSessionFactory();
        Session session = factory.openSession();
        Object fk=session.load(APTECH.class,new String(u));
        APTECH z=(APTECH)fk;
        Transaction tx = session.beginTransaction();
        session.delete(z);
        //session.flush();
        tx.commit();
        System.out.println("Object deleted successfully.....!!");
        session.close();
        factory.close();
        response.sendRedirect("index.jsp");
    }
    else {
        ((ConfigurableApplicationContext)ctx).close();
        response.sendRedirect("index.jsp");
    }
}

APTECHDAO.java

package sanish;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.ResultSetExtractor;

public class APTECHDAO {
private JdbcTemplate template;  

public void setTemplate(JdbcTemplate template) {  
    this.template = template;  
}  

public List<APTECH> getAllAPTECH(){  
 return template.query("select USERNAME,PASSWORD,ROLE from APTECH",new 
ResultSetExtractor<List<APTECH>>(){  
    @Override  
     public List<APTECH> extractData(ResultSet rs) throws SQLException,  
            DataAccessException {  

        List<APTECH> list=new ArrayList<APTECH>();  
        while(rs.next()){  
        APTECH e = new APTECH();
        e.setUSERNAME(rs.getString(1));
        e.setPASSWORD(rs.getString(2));
        e.setROLE(rs.getString(3));
        list.add(e);
        }  
        return list;
        }  
    });  
  }  
}

hibernate.cfg.xml

<?xml version='1.0' encoding='UTF-8'?>  
<!DOCTYPE hibernate-configuration PUBLIC  
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"  
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 

<hibernate-configuration>  

<session-factory>  
  <property name="hbm2ddl.auto">update</property>  
  <property name="dialect">org.hibernate.dialect.DerbyDialect</property>  
  <property 
  name="connection.url">jdbc:derby://localhost:1527/sample;
  create=true;upgrade= true</property>  
  <property name="connection.username">root</property>  
  <property name="connection.password">root</property>  
  <property 
  name="connection.driver_class">org.apache.derby.jdbc.Clie
  ntDriver</property>  
  <property name="show_sql">true</property>
  <property name="format_sql">true</property>
  <property name="hibernate.connection.pool_size">10</property>
  <property 
  name="hibernate.current_session_context_class">thread</property>
 <mapping class="sanish.APTECH"/>
 </session-factory>  
 </hibernate-configuration> 

错误日志:

Jan 07, 2019 5:35:23 PM org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl getIsolatedConnection
INFO: HHH10001501: Connection obtained from JdbcConnectionAccess [org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess@4a40c177] for (non-JTA) DDL execution was not in auto-commit mode; the Connection 'local transaction' will be committed and the Connection will be set into auto-commit mode.
Hibernate: 
    select
        a1_0.USERNAME,
        a1_0.EMAIL,
        a1_0.PASSWORD,
        a1_0.ROLE,
        a1_0.SCORE1,
        a1_0.SCORE2,
        a1_0.SCORE3,
        a1_0.SCORE4 
    from
        APTECH as a1_0 
    where
        a1_0.USERNAME=?
Hibernate: 
    delete APTECH 
    where
        USERNAME=?
Jan 07, 2019 5:35:23 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
WARN: SQL Error: 20000, SQLState: 42X01
Jan 07, 2019 5:35:23 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
ERROR: Syntax error: Encountered "APTECH" at line 1, column 8.
Jan 07, 2019 5:35:23 PM org.hibernate.internal.ExceptionMapperStandardImpl mapManagedFlushFailure
ERROR: HHH000346: Error during managed flush [org.hibernate.exception.SQLGrammarException: JDBC exception executing SQL [delete APTECH where USERNAME=?]]
Jan 07, 2019 5:35:23 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [sanish.Delete] in context with path [/Test_Project] threw exception
javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: JDBC exception executing SQL [delete APTECH where USERNAME=?]

这表明delete sql语法错误。

0 个答案:

没有答案
相关问题