節 8.01 基本查詢
如下是HQL/QBC/Native SQL三種查詢策略
HQL策略:sql
- session.createQuery("FROM Category c where c.name like 'Laptop%'");
QBC策略:session
- session.createCriteria(Category.class).add(Restrictions.like("name", "Laptop%"));
Native SQL策略spa
- session.createSQLQuery("select {c.*} from CATEGORY {c} where NAME like 'Laptop%'").
- addEntity("c",Category.class);
節 8.02 分頁查詢對象
- Criteria criteria = session.createCriteria(Category.class)
- .add(Restrictions.like("name", "Laptop%"));
- criteria.addOrder(Order.asc("name"));
- criteria.setFirstResult();//初始行數
- criteria.setMaxResults(20);//每頁顯示行數
節 8.03 數據過濾
方法 說明
Restrictions.eq =
Restrictions.allEq 利用Map來進行多個等於的限制
Restrictions.gt >
Restrictions.ge >=
Restrictions.lt <
Restrictions.le <=
Restrictions.between BETWEEN
Restrictions.like LIKE
Restrictions.in in
Restrictions.and and
Restrictions.or or
Restrictions.sqlRestriction 用SQL限定查詢
(a) 應用限制接口
- Criterion emailEq = Restrictions.eq("email", "w@163.com");
- Criteria criteria = session.createCriteria(User.class);
- criteria.add(emailEq);
- User user = (User)criteria.uniqueResult();
(b) 比較表達式ip
- Restrictions.between("amount", new BigDecimal(100), new BigDecimal(200));
- Restrictions.gt("amount", new BigDecimal(100));
- Restrictions.in("email", emails);//注:emails爲集合
- Restrictions.isNull("email");
- Restrictions.isNotNull("email");
- Restrictions.isEmpty("bids");
- Restrictions.sizeGe("bids", 3);//bids屬性大小
(c) 字符串匹配ci
- Restrictions.like("email", "G%");
- Restrictions.like("email", "G%",MatchMode.START);
- 注:MatchMode分爲START,END,ANYWHERE,EXACT四種模式
- Restrictions.like("email", "G%").ignoreCase();
(d) 組合表達式和邏輯操做符字符串
- Restrictions.or(
- Restrictions.and(
- Restrictions.like("firstname", "G%"),
- Restrictions.like("lastname", "K%")),
- Restrictions.in("email",emails));
(e) SQL表達式it
- Restrictions.sqlRestriction("{alias}.name='tie' and {alias}.addr='dalian'");
- Restrictions.sqlRestriction("{alias}.name=?", "tie", Hibernate.STRING);//姓名爲tie的對象
- Restrictions.sqlRestriction("length({alias}.PASSWORD) < ?",5,Hibernate.INTEGER);
- //密碼小於5個字符對象
- Restrictions.sqlRestriction("'100' >all( select b.AMOUNT FROM BID b " +
- " WHERE b.ITEM_ID = {alias}.ITEM_ID)");//返回出價不大於100
(f) 子查詢
節 8.04 表關聯
(a) 隱式關聯
隱式關聯有兩種方法:
一、 Criteria接口的createCriteria()方法:io
- session.createCriteria(Item.class)
- .add(Restrictions.like("description", "Foo",MatchMode.ANYWHERE))
- .createCriteria("bids")
- .add(Restrictions.gt("amount",new BigDecimal(100)));
-
- session.createCriteria(Item.class)
- .createCriteria("seller")
- .add(Restrictions.like("email", "%@"));
二、 分配別名:
- session.createCriteria(Item.class)
- .createAlias("bids","b")
- .add(Restrictions.like("description", "%Foo%"))
- .add(Restrictions.gt("b.amount", new BigDecimal(100)));
-
- session.createCriteria(Item.class)
- .createAlias("seller", "s")
- .add(Restrictions.like("s.email","%@"));
(b) 抓取關聯
- session.createCriteria(Item.class)
- .setFetchMode("bids",FetchMode.JOIN)
- .add(Restrictions.like("description", "%Foo%"))
節 8.05 投影/報表查詢
(a) 簡單投影
- session.createCriteria(Item.class)
- .add(Restrictions.gt("endDate", new Date()))
- .setProjection(Projections.id());//返回單一屬性
-
- session.createCriteria(Item.class).setProjection(
- Projections.projectionList().add(Projections.id()).
- add(Projections.property("description")));//返回一個Object[]
(b) 統計分組
- session.createCriteria(Item.class)
- .setProjection(Projections.rowCount());
-
- session.createCriteria(Item.class)
- .setProjection(Projections.projectionList()
- .add(Projections.rowCount())
- .add(Projections.sum("sales"))
- .add(Projections.avg("score"))
- );
-
- session.createCriteria(Bid.class)
- .createAlias("bidder", "u")
- .setProjection(Projections.projectionList()
- .add(Property.forName("u.id").group())
- .add(Property.forName("u.username").group())
- .add(Property.forName("id").count())
- .add(Property.forName("amount").avg())
- );
(c) SQL投影
- String sqlFragment = "(select count(*) from Item i where i.item_id = item_id) "
- + " as numofitems";
- session.createCriteria(Bid.class).createAlias("bidder", "u")
- .setProjection(
- Projections.projectionList().add(
- Projections.groupProperty("u.id")).add(
- Projections.groupProperty("u.username")).add(
- Projections.count("id")).add(
- Projections.avg("amount")).add(
- Projections.sqlProjection(sqlFragment,
- new String[] { "numofitems" },
- new Type[] { Hibernate.LONG }))
-
- );