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