您的位置:首页 > 产品设计 > UI/UE

使用Hibernate 5.0、4.0、3.0 createSQLQuery执行原生Sql语句 遇到问题及解决办法集锦

2017-07-04 22:38 836 查看
1、Caused By:org.hibernate.exception.SQLGrammarException: Column '* not found.;

这个问题出现在使用addEntity(class),并且sql语句返回的字段中含有数据表的字段,比如“select ue_id from user_essay ",因为addEntity(class)局限于不指定返回的字段,如果使用addscalar,加上标量,那么返回的将是一个object数组,这就很蛋疼了。

2、Caused By:org.hibernate.PropertyNotFoundException: Could not find setter for * on class *;

因为addEntity的局限,所以用了query.setResultTransformer(Transformers.aliasToBean(entity));,来返回映射对象,然后报了这个错误。其实这个也不是不能使用,但是要将返回的相关字段写成javaBean相应的字段,比如javaBean中的字段为ueId,那么在使用"select ue_id from user_essay "时,就要写成”select ue_id  as ueId from user_essay ",这就很操蛋了;

3、直接报“java.lang.ClassCastException: com.mchange.v2.c3p0.impl.NewProxyPreparedStatement cannot be cast to java.sql.CallableStatement”,也是因为加了addEntity或者addscalar,然后javaBean与数据库的字段不一致(比如多了下划线)之类的原因

因为数据库为了区分不同表的不同字段,往往用前缀+下划线的方式,而javab中则使用驼峰命名的方式。这样使得使用原生sql查询的时候,即使能正确返回数据,也是一个object数据,所以我们需要写一个自定义的Transformers ,我直接用了http://blog.csdn.net/luxiaoshuai/article/details/41017249这里的类,该博主用的hibernate4或者3,对于hibernate 5不适用,因为hibernate 5改动了其中的几个类,如果熟悉hibernate
5的朋友当然使用起来是没问题的。

4、没搞清楚mchange-commons-java-0.2.3.4.jar,这个鸟jar包之前,不要引入;最新的jar包不要使用,否则很可能发生一系类恐怖而且网上没有答案的bug,比如“com.mysql.jdbc.JDBC42PreparedStatement cannot be cast to java.sql.CallableStatement“

5、出现Transcation的bug一般都是代码没加配置,或者没开启事务管理,或者没配置好事务管理器的方法,以下为没问题的例子

<!-- 配置Hibernate的SessionFactory,通过spring提供的 LocalSessionFactoryBean配置-->  

   <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">  

       <!-- 配置依赖的数据源属性 -->  

       <property name="dataSource" ref="dataSource"></property>  

       <!-- hibernate 配置文件的路径,也可以直接在spring配置中配置 -->  

       <property name="configLocation" value="classpath:hibernate.cfg.xml"></property>  

       

       <!-- 配置hibernate映射文件的路径,可以使用通配符 -->  

      <!--  <property name="mappingLocations" value="classpath:com/buryanddig/user/entity/*.hbm.xml"></property>   -->

       <!-- 配置hibernate扫描的包 ,使用注释,不使用配置文件-->

       <property name="packagesToScan" value="com.buryanddig.user.entity"/> 

   </bean>  

     

   <!-- 配置 Spring 的声明式事物 -->  

   <bean i
4000
d="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">  

       <property name="sessionFactory" ref="sessionFactory"></property>  

   </bean>  

     

   <!-- 配置事物属性 ,需要事物管理器-->  

   <tx:advice id="txAdvice" transaction-manager="transactionManager">  

       <tx:attributes>  

       <tx:method name="save*" propagation="REQUIRED"/>

      <tx:method name="del*" propagation="REQUIRED"/>

      <tx:method name="update*" propagation="REQUIRED"/>

      <tx:method name="add*" propagation="REQUIRED"/>

      <tx:method name="find*" propagation="REQUIRED"/>

      <tx:method name="get*" propagation="REQUIRED"/>

      <tx:method name="apply*" propagation="REQUIRED"/>

      <tx:method name="contains*" propagation="REQUIRED"/>

      <tx:method name="load*" propagation="REQUIRED"/>

      <tx:method name="query*" propagation="REQUIRED"/>

       </tx:attributes>  

   </tx:advice> 

6、注意使用jar包版本以及对应的配置问题
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: