Hibernate操作记录

1.在线API文档
http://tool.oschina.net/apidocs/apidoc?api=hibernate-4.1.4
2.hibernate的hql查询语句总结
https://www.cnblogs.com/xiaoluo501395377/p/3376256.html
3.POJO类即持久化类,遵循一些非硬性的被熟知要求,所有属性private 有默认构造方法,有常规get set方法,遵循pojo模型
4.Hibernate中查询语句尽量使用named parameter,可读性强,当hql中条件位置变化时,也不用改动别的位置,eg:
在这里插入图片描述
5.query.setFirstResult(0)分页查询从第一行开始,setMaxResults设置页面容量。
6.Hibernate提供了三种查询方式,原生sql,criteria和query区别,criteria不用写hql,直接调用各种规则。
7.Hql中除了from等关键字外其他类名属性等严格大小写
8.Hibernate与mybatis相同,一级缓存为session的,二级缓存跨session且是可以手动选择的
9.session.flush和session.clear和commit
flush会强制session一级缓存与数据库内容同步,即将对象的状态同步到数据库,但是是可以回滾的,commit执行前会先执行flush,然后不了回滾的提交,clear强制清空会话缓存,避免session对象缓存太大,出现OOM异常
10.返回多个值或对象用List等集合接收,返回一个值或者对象时用uniqueResult()这个方法
11.Unable to instantiate default tuplizer[org.hibernate.tuple.entity.PojoEntityTuplizer],这个错误一般是因为xml文件与类属性名称不对应,或者与表的表名、字段名不对应,或者某个属性缺少get set方法,此外,对于boolean类型的不要用is开头,而是仍然get set开头 否则hibernate无法识别get set,也就无法通过get set访问属性 ,也会报这个错
12.记录两个坑,一。hibernate中from后面的必须是持久化实体类,不能将子查询写在f其后,jin尽管sql中这样可以提高查询效率。二。实体类命名注意不要跟同一个工作空间的其他实体类重复,否则hql语句中可能会映射到别的实体类上 从而找不到属性 比如报错No data type for node:
13.hibernate中的动态查询, StringBuffer sb = new StringBuffer("from ToDo where 1=1 ");

	if (!StringUtil.isEmpty((searchData.getProductName()))) {
		sb.append(" and getProductName ='" + searchData.getProductName() + "'");
	}
	if (!StringUtil.isEmpty((searchData.getSubject()))) {
		sb.append(" and subject like '%" + searchData.getSubject() + "%'");
	}
	Query query = this.getDao(getDataSourceMapping()).createQuery(sb.toString());

	if ((!StringUtil.isEmpty(searchData.getStartDate()) && (!StringUtil.isEmpty((searchData.getEndDate()))))) {
		sb.append(" and acceptTime>= :start and acceptTime<= :end ");
		query =
			this.getDao(getDataSourceMapping()).createQuery(sb.toString()).setParameter("start", searchData.getStartDate())
				.setParameter("end", searchData.getEndDate());

	}

的注意,hibernate中在where条件查询时,除字符串可直接拼接外,其他的必须以?或者:parameter的形式赋参数,否则无法预编译,会出现sql报错,比如直接将java中的data类型拼接在字符串后面,实际上无法进行时间比较的。
14.hibernate3以后count聚合函数查出来的时候Long类型不能强转为其他比如Integer类型
15..配置映射路径时启动组件会去扫描路径下所有的xml文件,如果配置的路径中有任何一个xml文件自身映射有问题 ,就会导致启动报
在这里插入图片描述
16.数据类型不一致: 应为 NUMBER, 但却获得 BINARY,该错误一般是查询时参数传递有问题,本次错误原因是hibernate中sql语句传参为集合时用的是setParameter(‘list’,list),sql中的集合传参应该用setParameterList(“list”,list)
17.注意:hql不能使用insert语句,为hql语句是面向对象实现查询功能的
在我们选择插入数据时并没有使用到任何的查询功能,而update和delete都要使用where条件查询,因此导致了hql不能使用insert,只能使用update delete;如果要插入要么用sql,要么调session的save方法
18**.hibernate中sql语句的别名问题**:1。
t1.fname,t3.fname由于数据库中显示的列名都是fname,会导致查出的数据有两列一样,数据重复,而plsql中查的话数据正常显示的,应该是hibernate解析的问题(不确定,见鬼了),2.hibernate中不能有重复的别名出现 fcode as code,fname as code这样会报错
19.Hibernate数据库方言dialect
(1).原因,所有关系型数据库都支持sql,但是各个数据库都对标准sql做了一些自己的扩展,比如分页语句等等,那各个数据库就会存在一些差异,设置方言让hibernate知道使用的是什么数据库,它就会去加载对应数据库的扩展
(2)Dialect类中实现每种数据库相同的东西,
(3)对于不同数据库对应会有该类的一个扩展,最终通过DialectFactory来决定创建哪一个类,如果没有指定方言,则会自己选择合适的方言
(4)https://blog.csdn.net/gaolong123456/article/details/78889996
(5)hibernate自动选择方言的原理,是dialectFactory中将数据库产品名和对应的扩展类以key-value的形式存储起来,根据JDBC中产品名称选择,但一般还得自己配,
(6)Connection cannot be null when"hibernate.dialect"…这个错就是方言没选对
在这里插入图片描述
20.idea中所有的xml配置文件包括实体映射文件都要放在resources底下(标识为资源文件的文件,否则不会被编译,也就无法映射到实体
21.session.flush将会话的缓存清除,刷到数据库缓存,而transaction.commit则是执行sql,在commit之前会默认调用flush方法
21.spring整合hibernate https://www.cnblogs.com/sunfan1988/p/3495579.html
22**.解决sql中in超过1000元素的问题**
-1.改为用 column in() or column in ()的写法,见StringUtil工具类中的createinsql方法
-2.方法-1没有预编译,如果要用?这种预编译方式则用StringUtil工具类中的createinsql2,然后

String sql = "select content_ from t_wf_ex_history where "+StringUtil.createinsql2("ftaskid",values);
Query query = this.getDao(getDataSourceMapping()).createSQLQuery(sql);
for(int i =0;i<values.length;i++){
    query=query.setParameter(i,value[i]);
}
Blob blob = query.list();

-3.第三种就是利用List.subList方法,分成几个小于1000的之后用多个select语句查询eg:select * from t1 unoin all select * from t2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值