Hql是Hibernate中較爲強大的部分,其能夠將java的實體對象和Sql相互關聯起來,開發過程沒必要要傳入具體的sql,只要專一於類對象的相關邏輯便可。java
這裏咱們測試代碼採用了註解的形式,這裏要先配置一下註解的掃描位置,
sql
<property name="annotatedClasses"> <list> <value>com.xiaoming.test.hibernate.studentTest.Student</value> </list> </property>
或者採用以下packeage格式的配置
數組
<property name="packagesToScan"> <list> <value>com.xiaoming.test.hibernate.studentTest.*</value> </list> </property>
對應的註解方式寫法以下:
緩存
@SuppressWarnings("serial") @Entity @Table(name="student1") public class Student implements Serializable { @Id @Column(name="id") @GeneratedValue(strategy= GenerationType.IDENTITY) private Integer id; @Column(name="name") private String name; }
Hibernate中有兩種query方法,一種是createQuery,另外一種是createSQLQuery。這兩種方法的區別是前者能夠使用hql語句查詢,後者用sql語句查詢,前者返回的是Hibernate生成的Bean對象,後者返回的是對象數組,可是也能夠使用addEntity(xxx.class)映射成對應的bean返回。
session
咱們先看看createSQLQuery的使用方法:
函數
public void testHql() { //list方法返回object的屬性 String hql="select * from student1 where id =1"; Query query=session.createSQLQuery(hql); List result=query.list(); for(int i=0;i<result.size();i++){ Object[] objects = (Object[])result.get(i); for(int j=0;j<objects.length;j++){ System.out.println(objects[j].getClass().getName()); } } //list方法設置返回類型爲Map String hq2="select * from student1 where id =1"; Query query2=session.createSQLQuery(hql2); query2.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP); List result2=query2.list(); for(int i=0;i<result2.size();i++){ Map map = (Map) result2.get(i); System.out.println(map.get("id")); } //使用函數 String hql3="select count(id) NUM from student1"; Query query3=session.createSQLQuery(hql3).addScalar("NUM"); query3.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP); List result3=query3.list(); for(int i=0;i<result3.size();i++){ Map map = (Map) result3.get(i); System.out.println(map.get("NUM")); } }
這裏有個點要注意一下,除了list方法外,iterator也能夠獲取到對應的數據,他們的區別是list每次都會發出sql語句,list會向緩存中放入數據,而不利用緩存中的數據。iterator在默認狀況下利用緩存數據,但若是緩存中不存在數據有可能出現N+1問題。學習
下面是createQuery的使用方法,其中Student大寫表示對應的java對象。測試
//採用:的方法標識傳入參數 String hql = "from Student o where id = :id"; Query query = session.createQuery(hql); query.setParameter("id", 1); List result=query.list(); for (Iterator iter=result.iterator(); iter.hasNext();) { Student student = (Student)iter.next(); System.out.println(student.getName()); } //採用?的方式標識參數 String hql2 = "from Student o where id = ?"; Query query2 = session.createQuery(hql2); query2.setParameter(0,1); List result2=query2.list(); for (Iterator iter=result2.iterator(); iter.hasNext();) { Student student = (Student)iter.next(); System.out.println(student.getName()); } //能夠使用setParameterList方法傳入一系列參數 String hql3 = "from Student o where id in (:ids)"; Query query3 = session.createQuery(hql3); query3.setParameterList("ids",new Object[]{1,3}); List result3=query3.list(); for (Iterator iter=result3.iterator(); iter.hasNext();) { Student student = (Student)iter.next(); System.out.println(student.getName()); } //能夠直接返回單一對象 String hql4 = "select count(*) from Student"; Query query4 = session.createQuery(hql4); Long result4= (Long) query4.uniqueResult(); System.out.println(result4);
自此,Hql的內容和功能基本上學習的差很少了,從最開始的環境配置,相關概念,關聯關係到今天的Hql使用,Hibernate基本上已經入門了。之後須要多多在項目中練習,有時間也能夠看看相關的代碼實現,特別是java對象和相關sql的轉換那塊。spa