hibernate杂记

1,hibernate在进行复杂查询的情况下一样可以直接得到一个Map的list:
select new Map(a.id as id,a.name as name,b.type as type) from A a,B b where
a.id=b.aId;
...
List mapList=query.list();
....

在jsp页面可以和使用普通的JavaBean一样的方式输出
<c:forEach items="${mapList}" var="m">
<tr> <td>
<c:out value="${m.id}"/> </td> <td>
<c:out value="${m.name}"/> </td>
<td> <c:out value="${m.type}"/> </td> </tr>
</c:forEach>
这样的处理也是很简洁的

select new MyObj(id,name,deptid,deptName) from tb_usr,tb_dept where .....
这种方式要求MyObj类有对应的构造方法

2.HQL supports subqueries in the where clause. We can’t think of many good uses
for subqueries in the from clause, although select clause subqueries might be a
nice future extension.
不支持from后的子查询,支持where子查询
http://blog.zol.com.cn/655/article_654256.html

3, String sql="select {fi.*} from FuncInfo fi " +
   "left join RoleSubFunc rsf on fi.FuncId=rsf.FuncId "+
       "left join RoleInfo ri on rsf.RoleId=ri.RoleId "+
       "left join UserRole ur on ri.RoleId=ur.RoleId "+
       "where ur.UserId='"+userId+"'";//可以无限向上找父级
 List list =session.createSQLQuery(sql).addEntity("fi", FuncInfo.class).list();

4, 为什么Hibernate 3中的HQL无法查询汉字
使用同样的代码和配置文件,在Hibernate 2上完全没有问题,在Hibernate 3中,使用如下HQL查询,无法得到正确的结果集:
String hql = "from story where title like '%汉字%'";
Query q = session.createQuery(hql);
但用下面的HQL查询,却可以得到正确结果集:
String hql = " from story where title like '%english%'";
Query q = session.createQuery(hql);
答:如果采用的是拼接HQL的方式,从Hibernate 2升级到Hibernate 3确实会出现汉字乱码问题。在控制台中可以看到,SQL的汉字部分变成了乱码:
[DEBUG] 2005-08-14 14:33:58 org.hibernate.SQL - "select story0_.content from story as story0_ where story0_.title like '%&–°é—&&Š¨&€'
在Hibernate中,查询时应尽量使用占位符的写法(如下),这样既可以避免乱码问题,又可以避免潜在的SQL注入攻击:
getHibernate().find("from story where title like ? ", "%汉字%")
注:用"update TbTest set name='张三' "也会有类似的问题,要改为占位符的写法

5,使用Hibernate.DATE时,得到的时间不带分秒。
  可以考虑使用Hibernate.CALENDAR,实际类型是java.util.GregorianCalendar,然后再getTime()
6,报表查询  select new Table(t1.a,t2.b ...)  from .....
7,List cats = sess.createSQLQuery("select {cat.*} from cats cat")
        .addEntity("cat", Cat.class);
        .setMaxResults(50);
        .list();
8,貌似hibernate添加或修改对象,如果字符串类型的属性的值为空字符串(大小为0),则自动当null处理
9,如果在hbm中某属性设为not null,然后如果po中的该属性为null,则hibernate会抛异常
  但如果在hbm中设置属性的长度,而实际的长度超过了,hibernate不会抛异常
10,
http://yuonch.iteye.com/blog/89859
http://yuonch.iteye.com/blog/90727
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值