HQL/QBC/Native SQL三种查询策略

转载 2015年11月20日 17:02:49

HQL策略: Hibernate Query Language

Java代码
session.createQuery(“FROM Category c where c.name like ‘Laptop%’”);
session.createQuery(“FROM Category c where c.name like ‘Laptop%’”);

QBC策略: Query By Criteria

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);

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Restrictions.like和Restrictions.equal:
Restrictions.like(“filearea”, key,MatchMode.EXACT)/ 或者默认状态Restrictions.like(“filearea”, key)
等价于:Restrictions.eq (“filearea”, key)

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Session session = getHibernateTemplate().getSessionFactory() .openSession();
Criteria criteria = session.createCriteria(Film.class);
List list = criteria.add(
Restrictions.or(Restrictions.like(“description”, key,MatchMode.ANYWHERE),
Restrictions.or(Restrictions.like(“name”, key,MatchMode.ANYWHERE),
Restrictions.or( Restrictions.like(“direct”, key,MatchMode.ANYWHERE),
Restrictions.or(Restrictions.like(“mainplay”,key,MatchMode.ANYWHERE),
Restrictions.like(“filearea”, key,MatchMode.ANYWHERE)))))).list();
session.close();
return list;

上述这段qbc查询的代码翻译成sql大概是:
select * from Film
where description like ‘%key%’
or name like ‘%key%’
or direct like ‘%key%’
or mainplay like ‘%key%’
or filearea like ‘%key%’

start end anywhere exact是like的匹配方式:
MatchMode.START:字符串在最前面的位置.相当于”like ‘key%’”
MatchMode.END:字符串在最后面的位置.相当于”like ‘%key’”
MatchMode.ANYWHERE:字符串在中间匹配.相当于”like ‘%key%’”
MatchMode.EXACT:字符串精确匹配.相当于”like ‘key’”

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
QBC :Restrictions

分页查询

Java代码

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);//每页显示行数

数据过滤

方法 说明
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) 子查询
表关联
(a) 隐式关联
隐式关联有两种方法:
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) 抓取关联
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 }))
);

相关文章推荐

Hibernate总的来说共有三种查询方式:HQL、QBC和SQL三种

Hibernate总的来说共有三种查询方式:HQL、QBC和SQL三种。但是细分可以有如下几种: 一、HQL查询方式    这一种我最常用,也是最喜欢用的,因为它写起来灵活直观,而且与所熟悉的...

Hibernate OID、导航图、HQL、SQL、QBC查询方式示例

Hibernate OID、导航图、HQL、SQL、QBC查询方法示例 本案例使用的hibernate版本为  hibernate-release-5.2.10.Final  为了测试...

Hibernate里的HQL、QBC、SQL查询

-----------------------Query的list()方法  (1)查询结果为Object对象集合  List li=this.getSession().createQuery("fr...

Hibernate HQL,QBC查询 本地SQL查询

一、HQL查询 以双向一对多的  Department--Employee  为例 1.基本步骤: (1)创建query对象 (2)绑定参数 (3)执行查询 HQL语句中的参数可基于位置,...

HQL检索方式、QBC检索方式、SQL检索方式

本章介绍了Hibernate的几种主要检索方式:HQL检索方式、QBC检索方式、SQL检索方式。HQL是Hibernate Query Language的缩写,是官方推荐的查询语言。QBC是Query...

hibernate教程--检索方式详解(hql,sql,QBC)

1.1 Hibernate的检索方式 1.1.1 Hibernate的检索方式: 检索方式:查询的方式: 导航对象图检索方式:  根据已经加载的对象导航到其他对象 * Customer custome...

Hibernate深入理解----Hibernate 检索方式(HQL,QBC,本地SQL)

参考代码下载github:https://github.com/changwensir/java-ee/tree/master/hibernate4 •Hibernate 提供了以下几种检索...

Hibernate教程之四OID、HQL、SQL、QBC操作

Hibernate有四种操作方式,分别为OID、HQL、QBC、SQL。 OID:对象标识符,Hibernate来标记唯一的对象的标记,其实就是主键 可以实现的操作:增删改查 比如我们常用的 ...

HQL与QBC的查询条件.doc

  • 2008年03月10日 10:40
  • 34KB
  • 下载

SSH:Hibernate框架(Hibernate:HQL与QBC查询方式详解 )

首先来看一下,hibernate提供的几种检索方式: 1.导航对象图检索方式 :根据已经加载的对象,导航到其他对象。例如,对于已经加载的Customer对象,调用它的getOrders().iter...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:HQL/QBC/Native SQL三种查询策略
举报原因:
原因补充:

(最多只允许输入30个字)