关于hibernate NamedNativeQuery

时间:2009-09-15 15:37:35

标签: mysql hibernate stored-procedures

我是hibernate的新手,我使用@javax.persistence.NamedNativeQuery来解析从hibernate到mysql的存储过程调用,但是我遇到了错误。

请帮助:

我的持久课程是:

@Entity    
@javax.persistence.NamedNativeQuery(name = "SampleNameQuery", query = "call spS_NamedQuery(?,?)", resultClass = NamedQuery.class)    
public class NamedQuery {

 @Id
 public String name;

 @Column
 public String value;
}

我的mysql存储过程是:

DELIMITER $$

DROP PROCEDURE IF EXISTS `cpgDB`.`spS_NamedQuery`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `spS_NamedQuery`(IN name VARCHAR(255),OUT var_value VARCHAR(255))
BEGIN

SET var_value = (SELECT value FROM NamedQuery WHERE NamedQuery.name = name);
END$$

DELIMITER ;

调用此代码的主要方法是:

public static void main(String[] args) throws Exception {
  Transaction trx = null;
  Session session = HibernateSessionFactory.getSession();
  try {
   trx = session.beginTransaction();

   org.hibernate.Query query = session.getNamedQuery("SampleNameQuery");
   query.setParameter(0,"fsdfsdf");       
   String value = "";
   query.setParameter(1,value);       
   List objList = query.list();    
   trx.commit();
  } catch (Exception ex) {
   trx.rollback();
   throw ex;
  } finally {
   HibernateSessionFactory.closeSession();
  }    
 }

我的hibernate配置文件如下:

<?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="connection.username">xxxx</property>
  <property name="connection.url">jdbc:mysql://127.0.0.1:3306/cpgDB</property>
  <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
  <property name="myeclipse.connection.profile">MySQL</property>
  <property name="connection.password">xxxxx</property>
  <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
  <property name="hbm2ddl.auto">update</property>
  <property name="show_sql">true</property>
  <property name="format_sql">true</property>  
  <mapping class="Demo.NamedQuery"/>
 </session-factory>
</hibernate-configuration>

在执行代码时,我遇到以下错误/异常:

Sep 15, 2009 8:54:16 PM org.hibernate.util.JDBCExceptionReporter logExceptions
SEVERE: OUT or INOUT argument 2 for routine cpgDB.spS_NamedQuery is not a variable or NEW pseudo-variable in BEFORE trigger
Exception in thread "main" org.hibernate.exception.SQLGrammarException: could not execute query
 at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67)
 at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
 at org.hibernate.loader.Loader.doList(Loader.java:2214)
 at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2095)
 at org.hibernate.loader.Loader.list(Loader.java:2090)
 at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:289)
 at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1695)
 at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:142)
 at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:152)
 at Demo.TestDrive.main(TestDrive.java:44)
Caused by: com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: OUT or INOUT argument 2 for routine cpgDB.spS_NamedQuery is not a variable or NEW pseudo-variable in BEFORE trigger
 at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:930)
 at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2864)
 at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1567)
 at com.mysql.jdbc.ServerPreparedStatement.serverExecute(ServerPreparedStatement.java:1154)
 at com.mysql.jdbc.ServerPreparedStatement.executeInternal(ServerPreparedStatement.java:679)
 at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1256)
 at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:186)
 at org.hibernate.loader.Loader.getResultSet(Loader.java:1778)
 at org.hibernate.loader.Loader.doQuery(Loader.java:662)
 at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
 at org.hibernate.loader.Loader.doList(Loader.java:2211)
 ... 7 more

请帮助解决出错的问题并帮助我纠正错误。另请参考我可以了解更多有关此技术的合适链接。

提前致谢

与Ashish

1 个答案:

答案 0 :(得分:0)

我无法找到这个问题的答案,我实现的解决方案是不在我的存储过程中使用'out'字段并仅通过select命令返回sql查询的结果。

可能Hibernate还没有完全实现这个返回'Out'参数的功能。