Hibernate使用MySQL在SQL语法中生成错误

时间:2013-08-12 17:38:01

标签: sql hibernate grammar

尝试使用HQL从表中获取记录时出现错误

  

引起:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:你有一个   SQL语法错误;查看与您的手册相对应的手册   MySQL服务器版本,用于在'.userinfo附近使用正确的语法   userinfo0_其中userinfo0_.login_id ='muskan'和   userinfo0_.pwd ='麝香'在第1行

     

完整错误跟踪:

     

来自Userinfo userinfo,其中userinfo.loginId ='muskan'和   userinfo.pwd='muskan@admin'和userinfo.role ='Administrator'Exception   在线程“main”org.hibernate.exception.SQLGrammarException:可以   不执行查询   org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:92)     在   org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)     在org.hibernate.loader.Loader.doList(Loader.java:2452)处   org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2192)at at   org.hibernate.loader.Loader.list(Loader.java:2187)at   org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:452)at at   org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:363)     在   org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:196)     在org.hibernate.impl.SessionImpl.list(SessionImpl.java:1258)at   org.hibernate.impl.QueryImpl.list(QueryImpl.java:102)at   com.ovs.domain.UserDAO.validateUser(UserDAO.java:16)at   com.ovs.action.LoginTest.main(LoginTest.java:17)引起:   com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:你有一个   SQL语法错误;查看与您的手册相对应的手册   MySQL服务器版本,用于在'.userinfo附近使用正确的语法   userinfo0_其中userinfo0_.login_id ='muskan'和   userinfo0_.pwd ='麝香'在第1行   sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)     at sun.reflect.NativeConstructorAccessorImpl.newInstance(未知   来源)at   sun.reflect.DelegatingConstructorAccessorImpl.newInstance(未知   来自java.lang.reflect.Constructor.newInstance(未知来源)     在com.mysql.jdbc.Util.handleNewInstance(Util.java:406)at   com.mysql.jdbc.Util.getInstance(Util.java:381)at   com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1030)at at   com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)at at   com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3558)at at   com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3490)at at   com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1959)at at   com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2109)at at   com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2643)at at   com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2077)     在   com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2228)     在   org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:208)     在org.hibernate.loader.Loader.getResultSet(Loader.java:1869)at   org.hibernate.loader.Loader.doQuery(Loader.java:718)at   org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:270)     在org.hibernate.loader.Loader.doList(Loader.java:2449)... 9更多

表格结构:

CREATE TABLE `userinfo` (
  `login_id` varchar(10) NOT NULL,
  `pwd` varchar(15) NOT NULL,
  `role` varchar(15) NOT NULL,
  `lastlogon` bigint(20) NOT NULL,
  PRIMARY KEY  (`login_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

休眠设置:

<name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>

Java代码:

String query="from Userinfo userinfo where userinfo.loginId='"+userinfo.getLoginId()+"' and userinfo.pwd='"+ userinfo.getPwd()+
                      "' and userinfo.role='"+userinfo.getRole()+"'";   
        Query validateUserQuery= getsession().createQuery(query);

        System.out.print(validateUserQuery.getQueryString());
        List<Userinfo> result = validateUserQuery.list();

2 个答案:

答案 0 :(得分:0)

您应该尝试通过userinfo.login_id更改查询userinfo.loginId

答案 1 :(得分:0)

如果您可以显示“Userinfo”实体类或XML,那就太棒了。 在查询中,您可以使用参数,以便您的字符串看起来更好,并保护自己免受SQL注入。

String query="from Userinfo u where u.loginId = :loginId"
Query validateUserQuery= getsession().createQuery(query);
validateUserQuery.setParameter("loginId",userinfo.getLoginId());