1、在用Hibernate写增删改查时,有两种方式:a、HQL语句,b、原生态sql语句

如果我要执行的语句是:select * from Question

HQL是这么写的:

Session session = getSession();

String hql="from Question";

List list = (Question)session.createQuery(hql).list();

System.out.println(list.getTitle());

测试正常

SQL写法:

Session session=getSession();

String sql="select * from Question"

List list=(Question)session.createSQLQuery(sql).list();// 会发生类型转换错误,就是文章开头的那个错误

原因:
HQL中

String hql="from Question";

List list = (Question)session.createQuery(hql).list();

会根据你的hql语句,自动将session.createQuery(hql).list()的返回对象以hibernate生成的Bean为对象装入list返回

SQL中

String sql="select * from Question"

List list=(Question)session.createSQLQuery(sql).list();

则是以对象数组进行存储返回

一句话:HQL:返回list装的是Bean
SQL:返回对象就是一数组,数组在转为Question对象时,当然会报错。

解决方法:

第一种:直接老老实实用HQL去写吧= =参数化就百度“Hibernate
参数绑定”就行

第二种:使用原生SQL,调用其中的一个方法addEntity()

String sql="select * from Question";

Query query = session.createSQLQuery(sql).addEntity(XXXXXXX.class);

List list = (Question)query;

这样 list中也就装的是Question这洋一个个Bean对象了,问题还是不知道如何参数化= =!

找到方法了:

Hibernate中的分页语句可以这么写

session = HibernateUtils.getSession();
     session.beginTransaction();
     Query query = session.createQuery("from
User");
     query.setFirstResult(0);//从第一条记录开始
     query.setMaxResults(4);//取出四条记录
     List userList = query.list();

2、a different object with the same identifier value was already associated with the session。

  错误原因:在hibernate中同一个session里面有了两个相同标识但是是不同实体。

  解决方法一:session.clean()

  PS:如果在clean操作后面又进行了saveOrUpdate(object)等改变数据状态的操作,有可能会报出"Found two representations of same collection"异常。

  解决方法二:session.refresh(object)

   PS:当object不是数据库中已有数据的对象的时候,不能使用session.refresh(object)因为该方法是从hibernate的 session中去重新取object,如果session中没有这个对象,则会报错所以当你使用saveOrUpdate(object)之前还需要判 断一下。

  解决方法三:session.merge(object)

  PS:Hibernate里面自带的方法,推荐使用。

3、Found two representations of same collection

  错误原因:见1。

  解决方法:session.merge(object)

2、3、两中异常经常出现在一对多映射和多对多映射中

Hibernate中遇见的问题的更多相关文章

  1. Hibernate中事务的隔离级别设置

    Hibernate中事务的隔离级别,如下方法分别为1/2/4/8. 在Hibernate配置文件中设置,设置代码如下

  2. Hibernate中事务声明

    Hibernate中JDBC事务声明,在Hibernate配置文件中加入如下代码,不做声明Hibernate默认就是JDBC事务. 一个JDBC 不能跨越多个数据库. Hibernate中JTA事务声 ...

  3. Hibernate中的锁机制

    锁机制:是数据库为了保证数据的一致性<一个事务的各种操作不相互影响>而使各种共享资源在被并发访问访问变得有序所设计的一种规则,用来保证在当前用户进行操作数据的时候其他的用户不能对同一数据进 ...

  4. Java三大框架之——Hibernate中的三种数据持久状态和缓存机制

    Hibernate中的三种状态   瞬时状态:刚创建的对象还没有被Session持久化.缓存中不存在这个对象的数据并且数据库中没有这个对象对应的数据为瞬时状态这个时候是没有OID. 持久状态:对象经过 ...

  5. Hibernate 系列 07 - Hibernate中Java对象的三种状态

    引导目录: Hibernate 系列教程 目录 1. Java对象的三种状态 当应用通过调用Hibernate API与框架发生交互时,需要从持久化的角度关注应用对象的生命周期. 持久化声明周期是Hi ...

  6. JPA或Hibernate中的

    JPA执行原生SQL截断Char类型问题 在JPA的API中执行原生SQL:EntityManager.createNativeQuery(String sqlString); 传入参数是原生SQL语 ...

  7. Hibernate中Java对象的三种状态

                                                                                     Hibernate中Java对象的三种 ...

  8. JDBC与Hibernate中SQL语句参数设置的顺序问题

    JDBC中:设置从1开始 例: Connection con = DriverManager.getConnection("jdbc:mysql://localhost/...", ...

  9. hibernate 中createQuery与createSQLQuery两个用法

    hibernate 中createQuery与createSQLQuery两者区别是:前者用的hql语句进行查询,后者可以用sql语句查询前者以hibernate生成的Bean为对象装入list返回后 ...

随机推荐

  1. windows下composer安装不了或composer命令无效的解决办法

    安装方法: http://docs.phpcomposer.com/00-intro.html#Installation-Windows (官方中文帮助文档) 问题描述1: 通过Composer-Se ...

  2. shell编程其实真的很简单(四)

    上篇我们学习了shell中条件选择语句的用法.接下来本篇就来学习循环语句.在shell中,循环是通过for, while, until命令来实现的.下面就分别来看看吧. for for循环有两种形式: ...

  3. Linux(Ubuntu)下载安装破解Matlab2016

    跳过废话, 直接看教程 前言 笔者平常不是很喜欢用Matlab, 因为所需要的功能都能被Python替代, 而Matlab的肥和慢实在令人难以忍受. 在Linux系统下安装Matlab也比Window ...

  4. ArcGIS制图表达Representation-制图表达介绍

    ArcGIS制图表达技术-制图表达介绍 by 李远祥 在基于GIS数据的制图中,大部分都是使用的数据+符号应用的这种模式.这种模式已经被应用很多年,而且也是非常成熟.对应在ArcGIS体系里面,就是数 ...

  5. 读书笔记 effective c++ Item 15 在资源管理类中提供对原生(raw)资源的访问

    1.为什么需要访问资源管理类中的原生资源  资源管理类是很奇妙的.它们是防止资源泄漏的堡垒,没有资源泄漏发生是设计良好的系统的一个基本特征.在一个完美的世界中,你需要依赖这样的类来同资源进行交互,绝不 ...

  6. Win32/MFC/COM学习推荐书籍

    以前有不少朋友问关于学习各种技术的推荐书籍的问题,这里把我觉得比较好的一些书籍列一下,希望能起到抛砖引玉的作用就好了:) Win32开发 Programming Windows by Charles ...

  7. OpenGL理解

    说起编程作图,大概还有很多人想起TC的#include <graphics.h>吧? 但是各位是否想过,那些画面绚丽的PC游戏是如何编写出来的?就靠TC那可怜的640*480分辨率.16色 ...

  8. php投票练习

    一.题目要求:建立如下两个数据库,实现投票和%的统计结果: 二.具体编写方法: (1).建立数据库: 里面的蓝色背景的表格名称就是我们所需的表格! 表格内容如下: 表名:diaoyantimu 表名: ...

  9. 05String字符串课后作业

    1.请运行以下示例代码StringPool.java,查看其输出结果.如何解释这样的输出结果?从中你能总结出什么? 由此可得出,用加号连接的字符串和一整个字符串相同代码判断是true,而新开辟空间的不 ...

  10. linux 之程序管理

    一个程序的父进程可以用PPID来判断   命令ps -l 可以用来观察程序相关的输出信息   被关闭的程序又产生:crontab或者父进程产生的   我们将常驻在系统中的程序称为:服务(daemon) ...