Hibernate學習5--Hql查詢

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

相關文章
相關標籤/搜索