Hibernate之HQL总结

hibernate运行过程:

Hibernate作用
    1、hibernate是java应用和关系数据库之间的桥梁,她负责java对象和关系数据库之间的映射。
    2、hibernate内部封装了通过JDBC访问数据库的操作,向上层应用提供了面向对象的数据访问API。
Hibernate API简介
    1.提供访问数据库操作(session,transaction,query)
    2.配置hibernate接口(configuration)
    3.回调接口(Interceptor,Lifecycle,Vaildatable)
    4.用于扩展的功能接口(UserType,ComposititeUserType,IdentifierGenerator)
Query和Criteria接口
    都是查询接口,query实例包装了HQL(HQL: Hibernate查询语言)查询语句,hql是面向对象的,她引用类名及类的属性名
    而不是表名和字段名。Criteria接口完全封装了基于字符串形式的查询语句,比query‘接口更面向对象
    ,她擅长执行动态查询。session接口的find方法也居右数据查询功能,但她只是执行一些简单的hql
    查询语句的快捷方式,远没有query接口功能强大。
//直接from查询出来的是一个映射对象,即:查询整个映射对象所有字段
        String hql = "from Users";
        Query query = session.createQuery(hql);   

        List<Users> users = query.list();
        for(Users user : users){
            System.out.println(user.getName() + " : " + user.getPasswd() + " : " + user.getId());
        }   

 输出结果为:
name1 : password1 : 1
name2 : password2 : 2
name3 : password3 : 3

  

//查询单个字段
        String hql = " select name from Users";
        Query query = session.createQuery(hql);   

        List<String> list = query.list();
        for(String str : list){
            System.out.println(str);
        }
输出结果为:
name1
name2
name3  
//查询其中几个字段
        String hql = " select name,passwd from Users";
        Query query = session.createQuery(hql);
        //默认查询出来的list里存放的是一个Object数组
        List<Object[]> list = query.list();
        for(Object[] object : list){
            String name = (String)object[0];
            String passwd = (String)object[1];   

            System.out.println(name + " : " + passwd);
        }
输出结果为:
name1 : password1
name2 : password2
name3 : password3  
//查询其中几个字段,添加new map(),注意map里的m是小写的。也不需要导入包,这样通过query.list()出来的list里存放的不再是默认的Object数组了,而是map集合了
        String hql = " select new map(name,passwd) from Users";
        Query query = session.createQuery(hql);
        //默认查询出来的list里存放的是一个Object数组,但是在这里list里存放的不再是默认的Object数组了,而是Map集合了
        List<Map> list = query.list();
        for(Map user : list){
            //一条记录里所有的字段值都是map里的一个元素,key是字符串0,1,2,3....,value是字段值
            //如果将hql改为:String hql = " select new map(name as username,passwd as password) from Users";,那么key将不是字符串0,1,2...了,而是"username","password"了
            String name = (String)user.get("0");//get("0");是get(key),注意:0,1,2...是字符串,而不是整形
            String passwd = (String)user.get("1");   

            System.out.println(name + " : " + passwd);
        }
        /**
        输出结果为:
         name1 : password1
        name2 : password2
        name3 : password3
         */  
package com.domain;   

public class MyUser {   

    private String username;
    private String password;
//因为:String hql = " select new  com.domain.MyUser(name,passwd) from Users";所以必须要有接受2个参数的构造函数
    public MyUser(String username,String password){
        this.username = username;
        this.password = password;
    }   

    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }   

}  
//通过query.list()出来的list里存放的不再是默认的Object数组了,而是自定义的类MyUser,必须加包名,String hql = "from Users";中的Users类也是必须加包名的,但是因为再Users.hbm.xml里<hibernate-mapping auto-import="true"> auto-import默认值为true(所以auto-import属性也可以不写),自动导入了
        String hql = " select new  com.domain.MyUser(name,passwd) from Users";
        Query query = session.createQuery(hql);
        //默认查询出来的list里存放的是一个Object数组,但是在这里list里存放的不再是默认的Object数组了,而是MyUser对象了
        List<MyUser> myUsers = query.list();
        for(MyUser myUser : myUsers){
            String name = myUser.getUsername();
            String passwd = myUser.getPassword();
            System.out.println(name + " : " + passwd);
        }
        /**
        输出结果为:
        name1 : password1
        name2 : password2
        name3 : password3
         */  
//条件查询,参数索引值从0开始,索引位置。通过setString,setParameter设置参数
        String hql = "from Users where name=? and passwd=?";
        Query query = session.createQuery(hql);
        //第1种方式
//      query.setString(0, "name1");
//      query.setString(1, "password1");
        //第2种方式
        query.setParameter(0, "name1",Hibernate.STRING);
        query.setParameter(1, "password1",Hibernate.STRING);
        List<Users> list = query.list();
        for(Users users : list){
            System.out.println(users.getId());
        }   
//条件查询,通过setProperties设置参数
        String hql = "from Users where name=:username and passwd=:password";
        Query query = session.createQuery(hql);
        //MyUser类的2个属性必须和:username和:password对应
        MyUser myUser = new MyUser("name1","password1");
        query.setProperties(myUser);
        List<Users> list = query.list();
        for(Users users : list){
            System.out.println(users.getId());
        }  
在where子句中允许使用的表达式包括 大多数你可以在SQL使用的表达式种类:

数学运算符+, -, *, /

二进制比较运算符=, >=, <=, <>, !=, like

逻辑运算符and, or, not

in, not in, between, is null, is not null, is empty, is not empty, member of and not member of

"简单的" case, case ... when ... then ... else ... end,和 "搜索" case, case when ... then ... else ... end

字符串连接符...||... or concat(...,...)

current_date(), current_time(), current_timestamp()

second(...), minute(...), hour(...), day(...), month(...), year(...),

EJB-QL 3.0定义的任何函数或操作:substring(), trim(), lower(), upper(), length(), locate(), abs(), sqrt(), bit_length()

coalesce() 和 nullif()

cast(... as ...), 其第二个参数是某Hibernate类型的名字,以及extract(... from ...),只要ANSI cast() 和 extract() 被底层数据库支持

任何数据库支持的SQL标量函数,比如sign(), trunc(), rtrim(), sin()

JDBC参数传入 ?

命名参数:name, :start_date, :x1

SQL 直接常量 ‘foo‘, 69, ‘1970-01-01 10:00:01.0‘

Java public static final 类型的常量 eg.Color.TABBY

//查询编号为”S0002”的提供商提供的所有商品所涉及的类别

public void qryCategoriesBySupply(){
        Session session=this.getSession();
        List<Category>list=session.createQuery("select p.category from Product p where p.suppers.no=?")
        .setString(0, "S9002")
        .list();
        for(Category c:list){
            System.out.println(c.getName());
        }
        session.close();
    }

//查询可以提供某种商品的供应商信息(使用elements处理)

//查询名称为”TCL SHE8533”的商品的每个提供商的编号、名称(部分属性查询)

 public void qryNumName(){
    //select p.suppers.no,p.suppers.name from Product p where p.name=‘kodako‘
    //select s.no,s.name from Supper s where s.products.name=‘kodako‘
    Session session=this.getSession();
    List list=session
        .createQuery("select p.suppers.no,p.suppers.name from Product p where p.name=‘kodako‘")
        .list();
    for(Object obj:list){
        Object[] object=(Object[])obj;
        System.out.println(object[0]+":"+object[1]);
    }
    session.close();
 }

//查询可以提供某种商品的供应商信息(使用elements处理)

public void qrySupplyByElements(){
    Session session=this.getSession();
    Product product=(Product)session.get(Product.class, "0002");

    List<Supper> list=session
        .createQuery("from Supper s where :product in elements(s.products)")
        .setEntity("product", product)
        .list();

    for(Supper s:list){
        System.out.println(s.getName());
    }
    session.close();
}

//使用QBE查询,价格为2680,名称为”富士 S6500” 的商品

public void qryProByQBE(){
    Product product=new Product();
    product.setPrice(2680f);
    product.setName("富士 S6500");

    Session session=this.getSession();
    List<Product> list=session
        .createCriteria(Product.class)
        .add(Example.create(product))
        .list();

    for(Product p:list){
        System.out.println(p.getName()+":"+p.getPrice());
    }
    session.close();
}

转载地址:http://blog.csdn.net/xinyu0100/article/details/5385989

时间: 2025-01-12 11:43:15

Hibernate之HQL总结的相关文章

Hibernate之HQL介绍

Hibernate中提供了多种检索对象的方式,主要包括以下种类: 导航对象图检索方式:根据已经加载的对象导航到其他对象 OID检索方式:根据对象的OID来检索对象 HQL检索方式:使用面向对象的HQL查询语言 QBC检索方式:使用QBC(Query By Criteria)API来检索对象.这种API封装了基于字符串形式的查询语句,提供了更加面向对象的查询接口 本地SQL检索方式:使用本地数据库的SQL查询语句 本文主要介绍第三种方式,也就是HQL检索对象. HQL(Hibernate Quer

【HQL】hibernate查询语言hql

hibernate查询语言hql 在hql中关键字不区分大小写,通常小写,类的名称和属性名称必须区分大小写 1.简单属性查询[重要] * 单一属性查询,返会属性结果集列表,元素类型和实体类中相应的类型一致 * 多个属性查询,多个属性查询返会对象数组,对象数组的长度取决于属性的个数 对象数组中元素的类型取决于属性在实体类中的类型 * 如果认为返会数组不够对象化,可以使用hql动态实例化Student对象 参见:SimplePropertyQueryTest.java 2.实体对象查询[重要] *

Hibernate六 HQL查询

HQL查询一 介绍1.HQL:Hibernate Query Language,是一种完全面向对象的查询语言.使用Hibernate有多重查询方式可供选择:hibernate的HQL查询,也可以使用条件查询,甚至使用原生的SQL查询语句.Hibernate还提供了一种数据过滤功能,这些都用于删选目标数据.2.查询步骤:(1)获取Hibernate Session对象(2)编写HQL语句(3)以HQL语句为参数,调用Session的createQuery()方法创建查询对象(4)如果HQL语句包含

Hibernate学习---第九节:Hibernate之hql

一.Hql 入门 1.实体类: package learn.hibernate.bean; import java.util.Date; import java.util.HashSet; import java.util.Set; /** * 持久化类设计 * 注意: * 持久化类通常建议要有一个持久化标识符(ID) * 持久化标识符通常建议使用封装类(例如:Integer 因为基本类型存在默认值) * 持久化类通常建议手动添加一个无参构造函数 (因为有些操作是通过放射机制进行的) * 属性通

Java_Web三大框架之Hibernate+jsp+HQL分页查询

分页查询无处不在.使用Hibernate+jsp+HQL进行分页查询. 第一步:编写房屋实体类和House.hbm.xml映射. /* * 房屋实体类 */ public class House { private int id;//房屋id private HouseType type;//房屋类型 private Users2 user;//用户 private Street street;//街道 private String title;//标题 private String descr

hibernate的hql查询语句

hibernate的hql查询语句 在这里通过定义了三个类,Special.Classroom.Student来做测试,Special与Classroom是一对多,Classroom与Student是一对多的关系,这里仅仅贴出这三个bean的属性代码: Special类: public class Special { private int id; private String name; private String type; private Set<Classroom> rooms; .

Hibernate中HQL函数汇总及其说明

Criteria查询对查询条件进行了面向对象封装,符合编程人员的思维方式,不过HQL(Hibernate Query Language)查询提供了更加丰富的和灵活的查询特性,因此Hibernate将HQL查询方式立为官方推荐的标准查询方式,HQL查询在涵盖Criteria查询的所有功能的前提下,提供了类似标准SQL语句的查询方式,同时也提供了更加面向对象的封装.以下就是HQL的一些常用函数,有了这些函数,我们就可以拥有更多的灵活性,比如HQL如何取余,HQL如何返回集合的最值,HQL字符串处理,

hibernate 之 HQL语句总结【转】

1. 查询整个映射对象所有字段 //直接from查询出来的是一个映射对象,即:查询整个映射对象所有字段 String hql = "from Users"; Query query = session.createQuery(hql); List<Users> users = query.list(); for(Users user : users){ System.out.println(user.getName() + " : " + user.ge

hibernate注解HQL 报错

@Entity(name="icertInfo") HQL  查询的时候 需要写Entry 的name值,要不然会报错 iCertInfo is not mapped <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <!-- 用户名 --> <property name="user" value=&q

Hibernate之HQL基本用法

关于HQL HQL与SQL非常类似,只不过SQL的操作对象是数据表,列等对象,而HQL操作的是持久化类,实例,属性等. HQL是完全面向对象的查询语言,因此也具有面向对象的继承,多态等特性. 使用HQL的一般步骤为: 获取session对象 编写HQL语句 使用session的createQuery方法创建查询对象(Query对象) 使用SetXxx(index/para_name, value)为参数复制 使用Query对象的list()方法返回查询结果列表(持久化实体集) 下面演示一下HQL