MDA/MDD/TDD/DDD/DDDDDDD
posts - 536, comments - 111, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

hibernate杂记

Posted on 2008-02-16 05:04 leekiang 阅读(652) 评论(0)  编辑  收藏 所属分类: 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='张三' "也会有类似的问题,要改为占位符的写法
http://xqfy1983.blog.sohu.com/61054398.html

5,使用Hibernate.DATE时,得到的时间不带分秒。
  可以考虑使用Hibernate.CALENDAR,实际类型是java.util.GregorianCalendar,然后再getTime()
6,
报表查询  select new Table(t1.a,t2.b ...)  from .....
  select new Object(vo.id,vo.name) from VO vo
  这种写法需事先写好构造方法
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,如果要使生成得sql不是每次都包括所有的列,可配置参数实现:
<class name="onlyfun.caterpillar.User" table="T_USER"
dynamic-insert="true"
dynamic-update="true">
来源:http://caterpillar.onlyfun.net/Gossip/HibernateGossip/DynamicSQL.html
但并不是设置了dynamic-update=true就会有效果,要生效是有条件的.
(1)同一session内,对已经persisit的对象进行update。
但有一奇怪现象,例如memo字段原来为空,o.setMemo(null),生成的update的sql还是会有set memo=null的语句,不知道为什么
(2)不同session之间,update传入的对象是另一个session中的persist对象,然后merge
http://qbar.qq.com/u2011541/19.htm
http://xuliangyong.javaeye.com/blog/74696
11,
http://yuonch.javaeye.com/blog/89859
http://yuonch.javaeye.com/blog/90727

12,

session.createQuery("delete from Company where id=1").executeUpdate();
这种写法必须配置org.hibernate.hql.ast.ASTQueryTranslatorFactory,否则会报

HibernateQueryException: query must begin with SELECT or FROM
http://czg185960.spaces.live.com/blog/cns!32A09070624FB42C!208.entry

只有注册用户登录后才能发表评论。


网站导航: