Hibernate QBC語言
文章分類:Java編程
節(jié) 8.01 基本查詢
以下是HQL/QBC/Native SQL三種查詢策略
HQL策略:
Java代碼
session.createQuery("FROM Category c where c.name like 'Laptop%'");
session.createQuery("FROM Category c where c.name like 'Laptop%'");
QBC策略:
Java代碼
session.createCriteria(Category.class).add(Restrictions.like("name", "Laptop%"));
session.createCriteria(Category.class).add(Restrictions.like("name", "Laptop%"));
Native SQL策略
Java代碼
session.createSQLQuery("select {c.*} from CATEGORY {c} where NAME like 'Laptop%'").
addEntity("c",Category.class);
session.createSQLQuery("select {c.*} from CATEGORY {c} where NAME like 'Laptop%'").
addEntity("c",Category.class);
節(jié) 8.02 分頁查詢
Java代碼
Criteria criteria = session.createCriteria(Category.class)
.add(Restrictions.like("name", "Laptop%"));
criteria.addOrder(Order.asc("name"));
criteria.setFirstResult(0);//初始行數(shù)
criteria.setMaxResults(20);//每頁顯示行數(shù)
Criteria criteria = session.createCriteria(Category.class)
.add(Restrictions.like("name", "Laptop%"));
criteria.addOrder(Order.asc("name"));
criteria.setFirstResult(0);//初始行數(shù)
criteria.setMaxResults(20);//每頁顯示行數(shù)
節(jié) 8.03 數(shù)據(jù)過濾
方法 說明
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) 應用限制
Java代碼
Criterion emailEq = Restrictions.eq("email", "w@163.com");
Criteria criteria = session.createCriteria(User.class);
criteria.add(emailEq);
User user = (User)criteria.uniqueResult();
Criterion emailEq = Restrictions.eq("email", "w@163.com");
Criteria criteria = session.createCriteria(User.class);
criteria.add(emailEq);
User user = (User)criteria.uniqueResult();
(b) 比較表達式
Java代碼
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屬性大小
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) 字符串匹配
Java代碼
Restrictions.like("email", "G%");
Restrictions.like("email", "G%",MatchMode.START);
注:MatchMode分為START,END,ANYWHERE,EXACT四種模式
Restrictions.like("email", "G%").ignoreCase();
Restrictions.like("email", "G%");
Restrictions.like("email", "G%",MatchMode.START);
注:MatchMode分為START,END,ANYWHERE,EXACT四種模式
Restrictions.like("email", "G%").ignoreCase();
(d) 組合表達式和邏輯操作符
Java代碼
Restrictions.or(
Restrictions.and(
Restrictions.like("firstname", "G%"),
Restrictions.like("lastname", "K%")),
Restrictions.in("email",emails));
Restrictions.or(
Restrictions.and(
Restrictions.like("firstname", "G%"),
Restrictions.like("lastname", "K%")),
Restrictions.in("email",emails));
(e) SQL表達式
Java代碼
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
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) 子查詢
節(jié) 8.04 表關聯(lián)
(a) 隱式關聯(lián)
隱式關聯(lián)有兩種方法:
1、 Criteria接口的createCriteria()方法:
Java代碼
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)
.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", "%@"));
2、 分配別名:
Java代碼
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","%@"));
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) 抓取關聯(lián)
Java代碼
session.createCriteria(Item.class)
.setFetchMode("bids",FetchMode.JOIN)
.add(Restrictions.like("description", "%Foo%"))
session.createCriteria(Item.class)
.setFetchMode("bids",FetchMode.JOIN)
.add(Restrictions.like("description", "%Foo%"))
節(jié) 8.05 投影/報表查詢
(a) 簡單投影
Java代碼
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[]
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) 統(tǒng)計分組
Java代碼
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())
);
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投影
Java代碼
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 }))
);
本站僅提供存儲服務,所有內容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內容,請
點擊舉報。