如下是HQL/QBC/Native SQL三種查詢策略
HQL策略:
Java代碼
java
session.createQuery("FROM Category c where c.name like 'Laptop%'"); session.createQuery("FROM Category c where c.name like 'Laptop%'");
QBC策略:
Java代碼
sql
session.createCriteria(Category.class).add(Restrictions.like("name", "Laptop%")); session.createCriteria(Category.class).add(Restrictions.like("name", "Laptop%"));
Native SQL策略
Java代碼
session
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);
Java代碼
spa
Criteria criteria = session.createCriteria(Category.class) .add(Restrictions.like("name", "Laptop%")); criteria.addOrder(Order.asc("name")); criteria.setFirstResult(0);//初始行數 criteria.setMaxResults(20);//每頁顯示行數 Criteria criteria = session.createCriteria(Category.class) .add(Restrictions.like("name", "Laptop%")); criteria.addOrder(Order.asc("name")); criteria.setFirstResult(0);//初始行數 criteria.setMaxResults(20);//每頁顯示行數
方法 說明
code
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代碼
ip
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代碼
ci
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) 子查詢
(a) 隱式關聯
隱式關聯有兩種方法:
一、 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", "%@"));
二、 分配別名:
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) 抓取關聯
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%"))
(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) 統計分組
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 })) );