使用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包版本以及对应的配置问题
这个问题出现在使用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包版本以及对应的配置问题
相关文章推荐
- Hibernate中多表联合查询遇到的问题(原生态的SQL语句解决办法)
- 使用 Hibernate 在 JPA 中 调用 generateSchema 会出现执行两次 SQL 语句问题的解决方法
- 使用hibernate3的createSQLQuery遇到的问题
- 使用hibernate3的createSQLQuery遇到的问题
- 使用hibernate3的createSQLQuery遇到的问题
- 关于Hibernate在使用原生SQL语句多表查询所遇到的问题
- hibernate4中使用createSQLQuery方法执行sql语句的用法
- Hibernate使用原生SQL多表查询时字段名相同导致查询数据覆盖问题解决办法
- 关于执行Oracle下Sql语句中遇到的特殊字符问题解决办法。
- Hibernate 使用createSQLQuery查询时,缓存问题
- weblogic hibernate关于No Dialect mapping for JDBC type :-9 hibernate执行原生sql语句问题(www.50xiao.com)
- 使用Hibernate SQLQuery执行原生SQL
- 在hibernate中直接执行原生sql遇到类型转换问题
- ASP.NET 4.0中使用FreeTextBox和FCKeditor遇到安全问题警告的解决办法
- ASP.NET 4.0中使用FCKeditor遇到安全问题警告的解决办法
- 执行SQL语句时出现问题操作必须使用一个可更新的查询错误的解决方法
- SSH框架中3.0版本不能执行SQL语句update,insert的解决办法。
- ASP.NET 4.0中使用FreeTextBox和FCKeditor遇到安全问题警告的解决办法
- hibernate执行原生sql语句问题
- hibernate查询某一个对象后,执行createSQLQuery查询出现的问题