Hibernate查询2

Hibernate查询2

list()方法和interate()方法的区别:

list()方法是立即查询,interate()这个方法是延迟查询,iterate首先是先发送一条sql语句查询所有符合条件的id,然后根据查询到的id获得对应的记录。

iterate 这个方法支持一级缓存,也就是session缓存

list方法不支持一级缓存。

代码:

@Test
    public void testQuery19(){
        //group by 测试
        String hql = "select p.password, count(p.id) from Person p group by p.password";  
        Query query = session.createQuery(hql);
        List<Object[]> list = query.list();
        System.out.println("--size---"+list.size());
        for(Object[] o : list){
            
            System.out.println(o[0]+"----"+o[1]);
        }
    }
    
    @Test
    public void testQuery18(){
        //排序
        String hql = "from Person p  order by p.id desc";
        Query query = session.createQuery(hql);
        List<Person> list = query.list();
        System.out.println("--size---"+list.size());
        for(Person p : list){
            System.out.println(p);
        }
    }
    
    
    @Test
    public void testQuery17(){
        //hibernate推荐将 HQL 定义到一个专门的配置文件中
        //然后通过getNamedQuery方法获得参数指定查询语句
        Query query = session.getNamedQuery("seletePerson3");
        List<Person> list = query.list();
        System.out.println("--size---"+list.size());
        for(Person p : list){
            System.out.println(p);
        }
    }
    
    @Test
    public void testQuery16(){
        //hibernate推荐将 HQL 定义到一个专门的配置文件中
        //然后通过getNamedQuery方法获得参数指定查询语句
        Query query = session.getNamedQuery("seletePerson2");
        List<Person> list = query.list();
        System.out.println("--size---"+list.size());
        for(Person p : list){
            System.out.println(p);
        }
    }
    
    @Test
    public void testQuery15(){
        //hibernate推荐将 HQL 定义到一个专门的配置文件中
        //然后通过getNamedQuery方法获得参数指定查询语句
        Query query = session.getNamedQuery("seletePerson");
        query.setString("n", "%_8");
        List<Person> list = query.list();
        System.out.println("--size---"+list.size());
        for(Person p : list){
            System.out.println(p);
        }
    }
    
    
    @Test
    public void testQuery14(){
        //String hql = "from Person p where p.name like '%_8'";
        //hibernate 支持 模糊查询
        String hql = "from Person p where p.name like :n";
        Query query = session.createQuery(hql);
        //query.setString("n", "'%_8'");//错误:不能使用 单引号
        query.setString("n", "%_8");
        List<Person> list = query.list();
        System.out.println("--size---"+list.size());
        for(Person p : list){
            System.out.println(p);
        }
    }
    
    @Test
    public void testQuery13(){
        String hql = "from Person p where p.id in(:ids)";
        Query query = session.createQuery(hql);
        //query.setParameterList("ids", new Object[]{3,9,6});
        
        List idList = new ArrayList();
        idList.add(3);
        idList.add(6);
        idList.add(9);
        query.setParameterList("ids", idList);
        
        //query.setParameterList("ids", idList,IntegerType);
        List<Person> list = query.list();
        System.out.println("--size---"+list.size());
        for(Person p : list){
            System.out.println(p);
        }
    }
    
    @Test
    public void testQuery12(){
        String hql = "from Person p where p.id in(3,6,9)";
        Query query = session.createQuery(hql);
        List<Person> list = query.list();
        System.out.println("--size---"+list.size());
        for(Person p : list){
            System.out.println(p);
        }
    }
    
    @Test
    public void testQuery11(){
        //hibernate提供了 命名参数绑定 方式 进行参数赋值
        String hql = "from Person p where p.name = ?1 and p.password = ?2";
        Query query = session.createQuery(hql);
        //在执行list()之前通过 query.setXxx();进行参数绑定
        //参数1:表示命名参数占位符的名称
        //参数2:表示实际的参数值
        query.setString("1", "admin_8");
        query.setInteger("8",131);
        List<Person> list = query.list();
        System.out.println("--size---"+list.size());
        for(Person p : list){
            System.out.println(p);
        }
    }
    
    
    @Test
    public void testQuery10(){
        //hibernate提供了 命名参数绑定 方式 进行参数赋值
        String hql = "from Person p where p.name =:n";
        Query query = session.createQuery(hql);
        //在执行list()之前通过 query.setXxx();进行参数绑定
        //参数1:表示命名参数占位符的名称
        //参数2:表示实际的参数值
        query.setString("n", "admin_8");
        List<Person> list = query.list();
        System.out.println("--size---"+list.size());
        for(Person p : list){
            System.out.println(p);
        }
    }
    
    
    @Test
    public void testQuery9(){
        //可以同类型JDBC中 ? 占位符 进行条件参数 绑定
        String hql = "from Person p where p.name =?";
        Query query = session.createQuery(hql);
        //在执行list()之前通过 query.setXxx();进行参数绑定
        //参数1:表示占位符的位置(hibernate中占位符的位置是从  0 开始的,JDBC是从 1 开始)
        //参数2:表示实际的参数值
        query.setString(0, "admin_8");
        List<Person> list = query.list();
        System.out.println("--size---"+list.size());
        for(Person p : list){
            System.out.println(p);
        }
    }

 

 推荐使用配置文件这种方式来写HQL语句。

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping SYSTEM "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd" >

<hibernate-mapping package="bean">
    <!-- 推荐将 HQL 语句定义的一个统一的配置文件中方便以后维护 
        注意: 语句不能有 分号
    -->
    <query name="seletePerson">
        from Person p where p.name like :n
    </query>
    <!-- 如果有一些特殊符号可以 对应的转换符 替代 (可以参考editplus中的特殊符号) -->
    <query name="seletePerson2">
        from Person p where p.id &lt; 5
    </query>
    <!-- 如果有一些特殊符号还可以 使用 CDATA进行忽略处理 -->
    <query name="seletePerson3">
        <![CDATA[from Person p where p.id < 5]]>
    </query>
</hibernate-mapping>

 

 

 

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping SYSTEM "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd" >

<hibernate-mapping package="bean">
    
    <class name="Person" table="t_person" batch-size="2">
        
        <id name="id">
            <generator class="identity"/>
        </id>
        
        <property name="name" column="t_name"/>
        
        <property name="password" column="t_pass"/>
    
        <property name="birthday" type="timestamp"/>
    </class>
</hibernate-mapping>
<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
    <session-factory>
        <!-- 显示执行SQL语句 -->
        <property name="show_sql">true</property>
         <!-- 格式化SQL语句 -->
        <property name="format_sql">false</property>
        <!-- 驱动 -->
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <!-- 数据库url-->
        <property name="hibernate.connection.url">jdbc:mysql:///hibernate_db</property>
        <!-- 访问数据库用户名 -->
        <property name="hibernate.connection.username">root</property>
        <!-- 访问数据库密码 -->
        <property name="hibernate.connection.password">root</property>
        <!-- 方言(为了更好的操作具体的数据库) 
            如果使用的mysql数据版本在5.5之后的话,方言通常建议使用MySQL5InnoDBDialect
            MySQLDialect 不支持事务
            MySQLInnoDBDialect 支持事务
         -->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
        <!-- 自动创建表结构配置
            create-drop 在程序启动的时候创建对应数据库表结构,当SessionFatory关闭的时候会将创建的表结构删除
            create 在每次程序启动的时候先删除上次创建的数据库表结构,然后再创建对应新数据库表结构。
            update 在每次启动的时候会追加修改的表结构,但是不会影响原来的数据 (通常用这个)
            validate 在每次启动的时候会验证并修改的表结构。
         -->
        <property name="hibernate.hbm2ddl.auto">update</property>
        
        <!-- 引入对应的需要持久化类的配置文件 -->
        <mapping resource="bean/Person.hbm.xml"/>
        <!-- 引入一个专门定义HQL语句的文件 ,这样方便以后维护-->
        <mapping resource="bean/query.xml"/>
        
    </session-factory>
</hibernate-configuration>

 

 

 

posted on 2014-12-19 23:01  aicpcode  阅读(167)  评论(0编辑  收藏  举报

导航