文档章节

Hibernate QBC 语言

boonya
 boonya
发布于 2015/03/25 15:35
字数 934
阅读 533
收藏 10

 基本查询 

以下是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);



分页查询 

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


本文转载自:http://www.cnblogs.com/chenying99/archive/2012/05/01/2478323.html

boonya
粉丝 76
博文 282
码字总数 50711
作品 0
成都
高级程序员
私信 提问
Hibernate Hibernate的检索方式

HIbernate提供了以下几种检索对象的方式: ①、导航对象图检索方式:根据已经加载的对象,导航到其他对象。例如,对于已经加载的Customer对象,调用它的getOrders().iterator()方法就可以导航...

Winnie007
2015/10/02
22
0
我心中的Hibernate

刚才看到一哥门说Hibernate无法更新对象的一个属性。现在我说说我的看法。 首先我认为一个框架如果不能改变我的编程思维,那么我觉得没必要学。Hibernate我用了一些时间,感觉Hibernate做到的...

喜之郎
2012/10/10
873
10
Hibernate 检索查询的几种方式(HQL,QBC,本地SQL,集成Spring等)

1.非集成Spring Hibernate的检索方式,主要有以下五种。 1.导航对象图检索方式。(根据已经加载的对象,导航到其他对象。) 2.OID检索方式。(按照对象的OID来检索对象。) 3.HQL检索方式。(...

长平狐
2013/01/06
2.2K
0
Java程序员从笨鸟到菜鸟之(六十四)细谈Hibernate(十五)HQL与QBC查询方式详解

首先来看一下,hibernate提供的几种检索方式: 1.导航对象图检索方式 :根据已经加载的对象,导航到其他对象。例如,对于已经加载的Customer对象,调用它的getOrders().iterator()方法就可以...

长平狐
2012/11/12
178
0
Hibernate(五)——面向对象查询语言和锁

Hibernate做了数据库中表和我们实体类的映射,使我们不必再编写sql语言了。但是有时候查询的特殊性,还是需要我们手动来写查询语句呢,Hibernate框架为了解决这个问题给我们提供了HQL(Hiber...

凡尘里的一根葱
2015/11/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

c 基础教程六:c 循环结构

有的时候,我们可能需要多次执行同一块代码,c 语言提供了如下几种循环,各有特色。 while 循环 for 循环 do-while 循环 while 循环 只要给定的条件为真,C 语言中的 while 循环语句会重复执...

故城以南丶思念不安
22分钟前
4
0
spark 常见操作

为spark DataFrom 添加一个为 空的新列,使用UDF函数 想产生一个IntegerType类型列为null的DataFrame该怎么做。 import org.apache.spark.sql.functions._import org.apache.spark.sql.type...

蜉先生
33分钟前
2
0
Flutter for Web 详细预研

首先感谢@栖冰 @祖建国 一起对FFW的预研做的投入! 背景 Google在最新的Google I/O上推出了Flutter for Web,旨在进一步解决一次代码,多端运行的问题。Flutter for Web还处于早期试验版,官...

阿里云云栖社区
42分钟前
1
0
mongodb自动备份脚本

mongodb自动备份脚本 2019年04月08日 13:27:28 遗失的曾经! 阅读数 73 #!/bin/bash# 要备份的数据库名'多个数据库用空格分开# 备份文件要保存的目录basepath="/data/backup/dump$(da...

linjin200
44分钟前
1
0
如何使用pagehelper分页

<c:if test="${page != null && page.getTotal() > 0 }"> <nav style="text-align: center"><ul class="pagination pagination-lg"><li><a>共 ${page.total } 条记录</a></l......

南桥北木
53分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部