Hibernate的三種查詢方式

這三種方式的共同點:
1.在查詢多個字段時:
.list()裏面默認存放的是Object[]的集合
.uniqueResult()時,默認是Object[] (需要強轉,因爲實際上是Object類型)
2.在查詢一個字段時:
.list()裏面默認存放的是字段相應的類型
.uniqueResult()時,默認就是字段相應的類型(需要強轉,因爲實際上是Object類型)
3.select * 時
除了SQL查詢,其他兩種都會自動將查詢結果映射到實體對象中

表結構
示例表

  • 條件查詢(Criteria)
    Criteria(標準)
    Restriction(限制)
    通過session.CreateCriteria(Entity.class);獲得Criteria對象
Session session = HibernateUtil.SESSIONFACTORY.openSession();
//session.createCriteria(User.class)相當於select * from user(實體映射的表)
//add(Restrictions.條件(鍵,值)),相當於where ...
List<User> list = session.createCriteria(User.class).add(Restrictions.eq("username", "admin123")).list();
  • SQL查詢

通過session.createSQLQuery(sql語句)獲得SQLQuery對象
scalar(標量)

實例1:

Session session = HibernateUtil.SESSIONFACTORY.openSession();
        //.addScalar("字段",類型)在sql語句的基礎上,可以指定查詢的字段,並給查出來的字段設置類型,並添加到當前數組中
        //.addScalar("字段")在sql語句的基礎上,查詢指定的字段,查出來的就是字段相應的類型
        //.addEntity(實體類名.class),可以將查詢出來的結果封裝到實體類中(注意,只有在查詢所有字段時才生效),並添加到當前數組中
        List<Object[]> list = session.createSQLQuery("select * from user").addScalar("username").addEntity(User.class).list();
        for (Object[] objects : list) {
            System.out.println(Arrays.toString(objects));
            System.out.println(((User)objects[1]).getPassword());
            System.out.println(objects[0] instanceof String);
        }

結果:
Hibernate:
select
*
from
user
[admin1, com.linksky.query.entity.User@6bb33971]
abc123
true
[admin2, com.linksky.query.entity.User@9af67f5]
abc123
true
[admin123, com.linksky.query.entity.User@5ad20aca]
abc123
true

實例2:
通過StandardBasicTypes來指定字段的類型

        Session session = HibernateUtil.SESSIONFACTORY.openSession();
        List<Object[]> list = session.createSQLQuery("select * from user").addScalar("join_time").addEntity(User.class).list();
        for (Object[] objects : list) {
            System.out.println(new SimpleDateFormat("yyyy-MM-dd").format(objects[0]));
        }

結果:
Hibernate:
select
*
from
user
2017-08-02
2017-08-02
2017-08-02

從結果可以看出,join_time默認是相應的類型(timestamp)
如果給這個join_time指定一個類型:

        Session session = HibernateUtil.SESSIONFACTORY.openSession();
        List<Object[]> list = session.createSQLQuery("select * from user").addScalar("join_time",StandardBasicTypes.STRING).addEntity(User.class).list();
        for (Object[] objects : list) {
            System.out.println(objects[0] instanceof String);
        }

結果:
Hibernate:
select
*
from
user
true
true
true

從結果可以看出,確實將字段以指定的類型取了出來

實例3
分頁:

Session session = HibernateUtil.SESSIONFACTORY.openSession();
        //注意這裏的對象是Query,說明有繼承關係,並且分頁也同樣適用於HQL查詢
        Query query = session.createSQLQuery("select * from user").addEntity(User.class);
        //相當於設置了limit 0,2
        List<User> list = query.setFirstResult(0).setMaxResults(2).list();
        for (User user : list) {
            System.out.println(user.getUsername());
        }

結果:
Hibernate:
select
*
from
user limit ?
admin1
admin2

  • HQL查詢(重點)

HQL全稱:Hibernate Query Language

通過session.createQuery(hql語句)來獲得Query對象

hql語句中的字段全部都是對象的屬性或對象的

hql中的select * 可以省略不寫

        Session session = HibernateUtil.SESSIONFACTORY.openSession();
        Query query = session.createQuery("from User");
        List<User> list = query.list();
        for (User user : list) {
            System.out.println(user.getUsername());
        }

如果非要寫可以利用起別名

        Session session = HibernateUtil.SESSIONFACTORY.openSession();
        Query query = session.createQuery("select u from User as u");
        List<User> list = query.list();
        for (User user : list) {
            System.out.println(user.getUsername());
        }

結果都是一樣的:
Hibernate:
select
user0_.id as id1_0_,
user0_.username as username2_0_,
user0_.password as password3_0_,
user0_.join_time as join_tim4_0_
from
User user0_
admin1
admin2
admin123

可以通過兩種方式設置佔位符:
1.set類型(佔位符,值);
2.setParameter(佔位符,值);
區別:set類型 效率高 ,setParameter效率低但方便(可以不用知道字段的類型)

上面的兩種方式就在下面的例子中一起展示了

佔位符的兩種形式:
1.?

        Session session = HibernateUtil.SESSIONFACTORY.openSession();
        Query query = session.createQuery("from User where username = ?");
        //注意了,hibernate中佔位符下標從0開始,JDBC中從1開始
        query.setString(0, "admin123");
        List<User> list = query.list();
        for (User user : list) {
            System.out.println(user.getUsername());
        }
Session session = HibernateUtil.SESSIONFACTORY.openSession();
        Query query = session.createQuery("from User where username = ?");
        //這裏用了parameter
        query.setParameter(0, "admin123");
        List<User> list = query.list();
        for (User user : list) {
            System.out.println(user.getUsername());
        }

2.:變量名

        Session session = HibernateUtil.SESSIONFACTORY.openSession();
        Query query = session.createQuery("from User where username = :myvar");
        query.setString("myvar", "admin123");
        List<User> list = query.list();
        for (User user : list) {
            System.out.println(user.getUsername());
        }
        Session session = HibernateUtil.SESSIONFACTORY.openSession();
        Query query = session.createQuery("from User where username = :yourvar");
        query.setParameter("yourvar", "admin123");
        List<User> list = query.list();
        for (User user : list) {
            System.out.println(user.getUsername());
        }

以上4個代碼塊結果相同:
Hibernate:
select
user0_.id as id1_0_,
user0_.username as username2_0_,
user0_.password as password3_0_,
user0_.join_time as join_tim4_0_
from
User user0_
where
user0_.username=?
admin123

可以將查詢的字段指定爲自己的類型:

        Session session = HibernateUtil.SESSIONFACTORY.openSession();
        Query query = session.createQuery("select new map(username as un,password as pw) from User");
        List<Map<String,String>> list = query.list();
        for (Map<String, String> map : list) {
            System.out.println(map);
        }

結果:
Hibernate:
select
user0_.username as col_0_0_,
user0_.password as col_1_0_
from
User user0_
{un=admin1, pw=abc123}
{un=admin2, pw=abc123}
{un=admin123, pw=abc123}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章