Java 调用存储过程时在hibernate中出错

Java 调用存储过程时在hibernate中出错,java,mysql,hibernate,stored-procedures,Java,Mysql,Hibernate,Stored Procedures,我正在从hibernate调用一个存储过程,但它给了我一个错误。我分别在mysql中执行了该存储过程,它给了我结果。这是我从hibernate得到的错误 org.springframework.orm.hibernate3.HibernateSystemException: No Dialect mapping for JDBC type: -1; nested exception is org.hibernate.MappingException: No Dialect mapping for

我正在从hibernate调用一个存储过程,但它给了我一个错误。我分别在mysql中执行了该存储过程,它给了我结果。这是我从hibernate得到的错误

org.springframework.orm.hibernate3.HibernateSystemException: No Dialect mapping for JDBC type: -1; nested exception is org.hibernate.MappingException: No Dialect mapping for JDBC type: -1
at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:676)
at org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:412)
at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:424)
at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)
at org.springframework.orm.hibernate3.HibernateTemplate.findByNamedQuery(HibernateTemplate.java:988)
at com.iris.allofactor.data.dao.hibernate.HibernatePatientDao.getDetailedPatientList(HibernatePatientDao.java:2352)
at com.iris.allofactor.data.dao.test.PatientDaoTest.testgetPatientDetails(PatientDaoTest.java:578)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at junit.framework.TestCase.runTest(TestCase.java:154)
at junit.framework.TestCase.runBare(TestCase.java:127)
at junit.framework.TestResult$1.protect(TestResult.java:106)
at junit.framework.TestResult.runProtected(TestResult.java:124)
at junit.framework.TestResult.run(TestResult.java:109)
at junit.framework.TestCase.run(TestCase.java:118)
at junit.framework.TestSuite.runTest(TestSuite.java:208)
at junit.framework.TestSuite.run(TestSuite.java:203)
at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: org.hibernate.MappingException: No Dialect mapping for JDBC type: -1
at org.hibernate.dialect.TypeNames.get(TypeNames.java:56)
at org.hibernate.dialect.TypeNames.get(TypeNames.java:81)
at org.hibernate.dialect.Dialect.getHibernateTypeName(Dialect.java:192)
at org.hibernate.loader.custom.CustomLoader.getHibernateType(CustomLoader.java:161)
at org.hibernate.loader.custom.CustomLoader.autoDiscoverTypes(CustomLoader.java:131)
at org.hibernate.loader.Loader.getResultSet(Loader.java:1678)
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:2145)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2029)
at org.hibernate.loader.Loader.list(Loader.java:2024)
at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:111)
at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1655)
at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:142)
at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:164)
at org.springframework.orm.hibernate3.HibernateTemplate$33.doInHibernate(HibernateTemplate.java:997)
at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:419)
... 22 more
这是我试图调用的存储过程

PROCEDURE DETAILED_PATIENT_LIST(_clinicId INT,_offset INT,_count INT)
BEGIN
SET @a = _offset;
SET @b = _count;
SET @c = _clinicId;
DROP TEMPORARY TABLE  IF EXISTS MAX_VISIT;
DROP TEMPORARY TABLE IF EXISTS TOTAL_VISIT;
CREATE TEMPORARY TABLE TOTAL_VISIT (
KEY TOTAL_KEY(CLINIC_ID) )
SELECT VISIT_DATE AS VISIT_DATE,PV.PATIENT_ID,PV.VISIT_ID,PV.CLINIC_ID,VD.ICD_CODE_ONE,VD.ICD_CODE_TWO,
    VD.ICD_CODE_THREE,VD.ICD_CODE_FOUR,GROUP_CONCAT(VP.PROCEDURE_CODE SEPARATOR ',') PROCEDURE_CODE FROM 
    PATIENT_VISIT PV 
    JOIN VISIT_PROCEDURE VP ON  VP.CLINIC_ID = PV.CLINIC_ID AND VP.VISIT_ID = PV.VISIT_ID
JOIN VISIT_DIAGNOSIS VD ON  VD.CLINIC_ID = PV.CLINIC_ID AND VD.VISIT_ID = PV.VISIT_ID
    WHERE PV.CLINIC_ID = _clinicId AND VD.ICD_ID_ONE <> 0 GROUP BY PV.VISIT_ID    
ORDER BY PATIENT_ID,VISIT_DATE DESC;
CREATE TEMPORARY TABLE MAX_VISIT (
 KEY `MAX_KEY` (`CLINIC_ID`,`PATIENT_ID`) )
SELECT MAX(VISIT_DATE) AS     VISIT_DATE,PATIENT_ID,VISIT_ID,CLINIC_ID,ICD_CODE_ONE,ICD_CODE_TWO,

ICD_CODE_THREE,ICD_CODE_FOUR,PROCEDURE_CODE FROM TOTAL_VISIT WHERE    CLINIC_ID =     _clinicId GROUP BY PATIENT_ID;
PREPARE STMT FROM "SELECT    P.PATIENT_ID,P.CLINIC_ID,P.MRN,P.FIRST_NAME,P.LAST_NAME,P.MIDDLE_NAME,P.SSN,P.DOB,P.SEX,P.A    DDRESS_LINE1,
     P.ADDRESS_LINE2,P.CITY,P.STATE,P.COUNTRY,P.PHONE,P.ZIP,P.FAX,P.EMAIL,P.BILLING_METHOD,P.ALT_PHONE,
     P.MARITAL_STATUS,P.ACTIVE,P.INACTIVE_REASON,
     I1.POLICY_NO AS PRIMARY_POLICY_NO,I1.GROUP_NO AS PRIMARY_GROUP_NO,I1.EDOC_END AS I1EDOC_END,
     I2.POLICY_NO AS SECONDERY_POLICY_NO,I2.GROUP_NO AS SECONDERY_GROUP_NO,I2.EDOC_END AS I2EDOC_END,
     I3.POLICY_NO AS TERTIERY_POLICY_NO,I3.GROUP_NO AS TERTIERY_GROUP_NO,I3.EDOC_END AS I3EDOC_END,  
     B1.NAME AS PRIMARYINS,B1.ADDRESS_LINE1 AS PRIMARY_ADD1,B1.ADDRESS_LINE2 AS PRIMARY_ADD2,B1.CITY AS PRIMARY_CITY,B1.STATE AS PRIMARY_STATE,
     B1.COUNTRY AS PRIMARY_COUNTRY,B1.PHONE AS PRIMARY_PHONE,B1.ZIP AS PRIMARY_ZIP,B1.EMAIL AS PRIMARY_EMAIL,
     B2.NAME AS SECONDERY,B2.ADDRESS_LINE1 AS SECONDERY_ADD1,B2.ADDRESS_LINE2 AS SECONDERY_ADD2,B2.CITY AS SECONDERY_CITY,B2.STATE AS SECONDERY_STATE,
     B2.COUNTRY AS SECONDERY_COUNTRY,B2.PHONE AS SECONDERY_PHONE,B2.ZIP AS SECONDERY_ZIP,B2.EMAIL AS SECONDERY_EMAIL,
     B3.NAME AS TERTIERY,B3.ADDRESS_LINE1 AS TERTIERY_ADD1,B3.ADDRESS_LINE2 AS TERTIERY_ADD2,B3.CITY AS TERTIERY_CITY,B3.STATE AS TERTIERY_STATE,
     B3.COUNTRY AS TERTIERY_COUNTRY,B3.PHONE AS TERTIERY_PHONE,B3.ZIP AS TERTIERY_ZIP,B3.EMAIL AS TERTIERY_EMAIL,
     CONCAT(PH1.LAST_NAME, ', ' , PH1.FIRST_NAME , ' ' , PH1.MIDDLE_NAME) AS POLICYHOLDER1,PH1.RELATIONSHIP AS RELATIONSHIP1,
     PH1.ADDRESS_LINE1 AS PH1ADDRESS_LINE1,PH1.ADDRESS_LINE2 AS PH1ADDRESS_LINE2,PH1.CITY AS PH1CITY,PH1.STATE AS PH1STATE,PH1.COUNTRY AS PH1COUNTRY,
     CONCAT(PH2.LAST_NAME, ', ' , PH2.FIRST_NAME , ' ' , PH2.MIDDLE_NAME) AS POLICYHOLDER2,PH2.RELATIONSHIP AS RELATIONSHIP2,
     PH2.ADDRESS_LINE1 AS PH2ADDRESS_LINE1,PH2.ADDRESS_LINE2 AS PH2ADDRESS_LINE2,PH2.CITY AS PH2CITY,PH2.STATE AS PH2STATE,PH2.COUNTRY AS PH2COUNTRY, 
     CONCAT(PH3.LAST_NAME, ', ' , PH3.FIRST_NAME , ' ' , PH3.MIDDLE_NAME) AS POLICYHOLDER3,PH3.RELATIONSHIP AS RELATIONSHIP3,
     PH3.ADDRESS_LINE1 AS PH3ADDRESS_LINE1,PH3.ADDRESS_LINE2 AS PH3ADDRESS_LINE2,PH3.CITY AS PH3CITY,PH3.STATE AS PH3STATE,PH3.COUNTRY AS PH3COUNTRY,
     VISIT_DATE AS LASTVISIT,P.NET_BALANCE,ICD_CODE_ONE,ICD_CODE_TWO,ICD_CODE_THREE,ICD_CODE_FOUR,PROCEDURE_CODE
 FROM PATIENT P 
  LEFT JOIN A I1 ON (I1.CLINIC_ID = P.CLINIC_ID  AND I1.PATIENT_ID = P.PATIENT_ID AND I1.ACTIVE = TRUE AND I1.RANKING = 1)
  LEFT JOIN B I2 ON (I2.CLINIC_ID = P.CLINIC_ID  AND I2.PATIENT_ID = P.PATIENT_ID AND I2.ACTIVE = TRUE AND I2.RANKING = 2)
  LEFT JOIN C I3 ON (I3.CLINIC_ID = P.CLINIC_ID  AND I3.PATIENT_ID = P.PATIENT_ID AND I3.ACTIVE = TRUE AND I3.RANKING = 3)
  LEFT JOIN D B1 ON (B1.CLINIC_ID = I1.CLINIC_ID  AND B1.BUSINESS_ID = I1.COMPANY_ID AND I1.RANKING = 1 AND B1.ACTIVE = TRUE)
  LEFT JOIN D B2 ON (B2.CLINIC_ID = I2.CLINIC_ID  AND B2.BUSINESS_ID = I2.COMPANY_ID AND I2.RANKING = 2 AND B2.ACTIVE = TRUE)
  LEFT JOIN D B3 ON (B3.CLINIC_ID = I3.CLINIC_ID  AND B3.BUSINESS_ID = I3.COMPANY_ID AND I3.RANKING = 3 AND B3.ACTIVE = TRUE)
  LEFT JOIN E PH1 ON (PH1.CLINIC_ID = I1.CLINIC_ID AND PH1.POLICY_HOLDER_ID = I1.POLICY_HOLDER_ID)
  LEFT JOIN E PH2 ON (PH2.CLINIC_ID = I2.CLINIC_ID AND PH2.POLICY_HOLDER_ID = I2.POLICY_HOLDER_ID)
  LEFT JOIN E PH3 ON (PH3.CLINIC_ID = I3.CLINIC_ID AND PH3.POLICY_HOLDER_ID = I3.POLICY_HOLDER_ID)
  LEFT JOIN MAX_VISIT ON (MAX_VISIT.CLINIC_ID = P.CLINIC_ID AND MAX_VISIT.PATIENT_ID = P.PATIENT_ID)
   WHERE P.CLINIC_ID = ? AND P.MARK_AS_DELETE = 0  LIMIT ?,?";

EXECUTE STMT USING @c,@a,@b;

END 
程序详细患者列表(\u clinicId INT,\u offset INT,\u count INT)
开始
设置@a=\u偏移量;
设置@b=\u计数;
SET@c=\u clinicId;
如果存在最大访问量,则删除临时表;
如果存在总访问量,则删除临时表;
创建临时表TOTAL_vision(
总钥匙(诊所ID))
选择就诊日期作为就诊日期,PV.患者ID,PV.就诊ID,PV.诊所ID,VD.ICD代码一,VD.ICD代码二,
VD.ICD_代码_三,VD.ICD_代码_四,组_CONCAT(VP.PROCEDURE_代码分隔符','))程序_代码自
病人就诊
在VP.CLINIC\u ID=PV.CLINIC\u ID和VP.VISIT\u ID=PV.VISIT\u ID上加入就诊程序VP
加入VD.CLINIC\u ID=PV.CLINIC\u ID和VD.VISIT\u ID=PV.VISIT\u ID上的就诊诊断VD
其中,PV.CLINIC_ID=_clinicId和VD.ICD_ID_一组,按PV.Visite_ID
按患者ID、就诊日期描述订购;
创建临时表MAX\u VISIT(
KEY`MAX\u KEY`(`CLINIC\u ID`、`PATIENT\u ID`)
选择MAX(就诊日期)作为就诊日期、患者ID、就诊ID、诊所ID、ICD代码1、ICD代码2,
ICD代码三、ICD代码四、来自总就诊的程序代码,其中诊所ID=按患者ID划分的临床医生ID组;
从“选择P.患者ID、P.诊所ID、P.MRN、P.名字、P.姓氏、P.中间名、P.SSN、P.DOB、P.SEX、P.A地址”行1、,
P.地址第2行,P.城市,P.州,P.国家,P.电话,P.邮政编码,P.传真,P.电子邮件,P.计费方法,P.备用电话,
P.婚姻状况,P.活跃,P.不活跃的原因,
I1.POLICY\u NO作为PRIMARY\u POLICY\u NO,I1.GROUP\u NO作为PRIMARY\u GROUP\u NO,I1.EDOC\u END作为I1EDOC\u END,
I2.POLICY_NO作为secondary_POLICY_NO,I2.GROUP_NO作为secondary_GROUP_NO,I2.EDOC_END作为I2EDOC_END,
I3.POLICY\u NO AS TERTIERY\u POLICY\u NO,I3.GROUP\u NO AS TERTIERY\u GROUP\u NO,I3.EDOC\u END AS I3EDOC\u END,
B1.名称作为主要地址,B1.地址作为主要地址,B1.地址作为主要地址,B1.城市作为主要城市,B1.州作为主要州,
B1.国家/地区作为主要国家/地区,B1.电话作为主要电话,B1.ZIP作为主要邮政,B1.电子邮件作为主要电子邮件,
B2.名称为二级,B2.地址为二级,B2.地址为二级,B2.城市为二级,B2.州为二级,
B2.COUNTRY作为SECONDERY_COUNTRY,B2.PHONE作为SECONDERY_PHONE,B2.ZIP作为SECONDERY_ZIP,B2.EMAIL作为SECONDERY_EMAIL,
B3.名称为TERTIERY,B3.地址行1为TERTIERY\u ADD1,B3.地址行2为TERTIERY\u ADD2,B3.城市为TERTIERY\u城市,B3.州为TERTIERY\u州,
B3.COUNTRY作为TERTIERY_COUNTRY,B3.PHONE作为TERTIERY_PHONE,B3.ZIP作为TERTIERY_ZIP,B3.EMAIL作为TERTIERY_EMAIL,
CONCAT(PH1.LAST_NAME,,,,PH1.FIRST_NAME,,,PH1.MIDDLE_NAME)作为保单持有人1,PH1.RELATIONSHIP作为关系1,
PH1.ADDRESS_LINE1为PH1 ADDRESS_LINE1,PH1.ADDRESS_LINE2为PH1 ADDRESS_LINE2,PH1.CITY为PH1 CITY,PH1.STATE为PH1 STATE,PH1.COUNTRY为PH1 COUNTRY,
CONCAT(PH2.LAST_NAME,,,,PH2.FIRST_NAME,,,PH2.MIDDLE_NAME)作为保单持有人,PH2.RELATIONSHIP2作为关系,
PH2.ADDRESS_LINE1为PH2 ADDRESS_LINE1,PH2.ADDRESS_LINE2为PH2 ADDRESS_LINE2,PH2.CITY为PH2 CITY,PH2.STATE为PH2 STATE,PH2.COUNTRY为PH2 COUNTRY,
CONCAT(PH3.LAST_NAME,,,,PH3.FIRST_NAME,,,PH3.MIDDLE_NAME)作为保单持有人3,PH3.RELATIONSHIP3,
PH3.ADDRESS_LINE1为PH3 ADDRESS_LINE1,PH3.ADDRESS_LINE2为PH3 ADDRESS_LINE2,PH3.CITY为PH3 CITY,PH3.STATE为PH3 STATE,PH3.COUNTRY为PH3 COUNTRY,
就诊日期为上次就诊、P.NET余额、ICD代码1、ICD代码2、ICD代码3、ICD代码4、程序代码
来自患者P
左键连接I1 ON(I1.CLINIC_ID=P.CLINIC_ID和I1.PATIENT_ID=P.PATIENT_ID和I1.ACTIVE=TRUE和I1.RANKING=1)
左连接B I2 ON(I2.CLINIC_ID=P.CLINIC_ID和I2.PATIENT_ID=P.PATIENT_ID和I2.ACTIVE=TRUE和I2.RANKING=2)
左连接I3打开(I3.CLINIC\u ID=P.CLINIC\u ID和I3.PATIENT\u ID=P.PATIENT\u ID和I3.ACTIVE=TRUE和I3.RANKING=3)
左连接D B1打开(B1.CLINIC_ID=I1.CLINIC_ID和B1.BUSINESS_ID=I1.COMPANY_ID和I1.RANKING=1和B1.ACTIVE=TRUE)
左连接D B2 ON(B2.CLINIC_ID=I2.CLINIC_ID和B2.BUSINESS_ID=I2.COMPANY_ID和I2.RANKING=2和B2.ACTIVE=TRUE)
左连接B3打开(B3.CLINIC\u ID=I3.CLINIC\u ID和B3.BUSINESS\u ID=I3.COMPANY\u ID和I3.RANKING=3和B3.ACTIVE=TRUE)
左连接E PH1 ON(PH1.CLINIC\u ID=I1.CLINIC\u ID和PH1.POLICY\u HOLDER\u ID=I1.POLICY\u HOLDER\u ID)
左连接E PH2 ON(PH2.CLINIC\u ID=I2.CLINIC\u ID和PH2.POLICY\u HOLDER\u ID=I2.POLICY\u HOLDER\u ID)
左连接E PH3 ON(PH3.CLINIC\u ID=I3.CLINIC\u ID和PH3.POLICY\u HOLDER\u ID=I3.POLICY\u HOLDER\u ID)
左侧加入MAX_就诊开启(MAX_-VISIT.CLINIC_ID=P.CLINIC_ID和MAX_-VISIT.PATIENT_ID=P.PATIENT_ID)
其中P.CLINIC_ID=?和P.MARK_AS_DELETE=0 LIMIT?,?”;
使用@c、@a、@b执行STMT;
终止
我不知道为什么会发生此错误,因为我得到了独立调用存储过程的结果。任何人都能找到解决方案吗?提前感谢

这是hibernate的配置,代码

---------------------------------------------------------------------------------------   ------
hibernate.dialect=org.hibernate.dialect.MySQLDialect
hibernate.show_sql=true
#hibernate.query_factory_class=org.hibernate.hql.classic.ClassicQueryTranslatorFactory
hibernate.query_factory_class=org.hibernate.hql.ast.ASTQueryTranslatorFactory



<property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">${hibernate.dialect}</prop>
            <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>         
            <prop key="hibernate.query.factory_class">${hibernate.query_factory_class}</prop>       
            <prop key="hibernate.generate_statistics">true</prop>

        </props>
    </property>

<bean id="transactionManager"   class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory"><ref bean="sessionFactory"/></property>
</bean>



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

<hibernate-mapping>   

<sql-query name="getDetailedPatientListReport" callable="true" >
{ call DETAILED_PATIENT_LIST (?,?,?) }
</sql-query>
</hibernate-mapping>



code:

getHibernateTemplate().findByNamedQuery("getDetailedPatientListReport",new Object[]  
{iClinicId,start,range});
--------------------------------------------------------------------------------------------
hibernate.dialogue=org.hibernate.dialogue.mysqldialogue
hibernate.show_sql=true
#hibernate.query\u factory\u class=org.hibernate.hql.classic.ClassicQueryTranslatorFactory
hibernate.query\u factory\u class=org.hibernate.hql.ast.ASTQueryTranslatorFactory
${hibernate.dial}
${hibernate.show_sql}
${hibernate.query\u factory\u class}
符合事实的
{呼叫详细的患者名单(?,?)}
代码:
getHibernateTemplate().findByNamedQuery(“getDetailedPatientListReport”,新对象[]
{iClinicId,start,range});

您还可以显示调用存储过程的脚本和代码吗。另请参阅