`
JaHunter
  • 浏览: 92790 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Hibernate代码小集

    博客分类:
  • java
阅读更多

1.hibernate:查找总共多少条记录

       Long count = (Long)session.createQuery("select count(*) from Student").uniqueResult();

2.分组查询多少条记录并输出

            List students =session.createQuery("select c.name, count(s) from Student s join s.classes c " +
                    "group by c.name order by c.name").list();
            for (Iterator iter=students.iterator(); iter.hasNext();) {
                Object[] obj = (Object[])iter.next();
                System.out.println(obj[0] + ", " + obj[1]);
            }

3.这样的方式(session.createSQLQuery("..."))要以数组形式输出

            List students = session.createSQLQuery("select * from t_student").list();
            for (Iterator iter=students.iterator(); iter.hasNext();) {
                Object[] obj = (Object[])iter.next();
                System.out.println(obj[0] + "," + obj[1]);
            }

4.单一属性查询

            //返回结果集属性列表,元素类型和实体类中相应的属性类型一致
            List students = session.createQuery("select name from Student").list();
            for (Iterator iter=students.iterator(); iter.hasNext();) {
                String name = (String)iter.next();
                System.out.println(name);
            }

5.多个属性查询

            //查询多个属性,其集合元素是对象数组
            //数组元素的类型和对应的属性在实体类中的类型一致
            //数组的长度取决与select中属性的个数
            List students = session.createQuery("select id, name from Student").list();
            for (Iterator iter=students.iterator(); iter.hasNext();) {
                Object[] obj = (Object[])iter.next();
                System.out.println(obj[0] + "," + obj[1]);
            }

6.实体查询1(以Student对象为例)

            //如果认为返回数组不够对象化,可以采用hql动态实例化Student对象
            //此时list中为Student对象集合
            List students = session.createQuery("select new Student(id, name) from Student").list();
            for (Iterator iter=students.iterator(); iter.hasNext();) {
                Student student = (Student)iter.next();
                System.out.println(student.getId() + "," + student.getName());
            }

7.实体对象查询2

            /**
             * 采用list查询发出一条查询语句,取得Student对象数据、
             *
             * Hibernate: select student0_.id as id1_, student0_.name as name1_,
             * student0_.createTime as createTime1_, student0_.classesid as classesid1_
             * from t_student student0_
             *
             */
            List students = session.createQuery("from Student").list();
            for (Iterator iter=students.iterator(); iter.hasNext();) {
                Student student = (Student)iter.next();
                System.out.println(student.getName());
            }

8.实体对象查询3

            //返回Student对象的集合
            //使用select查询实体对象,必须采用别名
            List students = session.createQuery("select s from Student as s").list();
            for (Iterator iter=students.iterator(); iter.hasNext();) {
                Student student = (Student)iter.next();
                System.out.println(student.getName());
            }

            //不支持select * from .....这样的查询语句
            List students = session.createQuery("select * from Student").list();
            for (Iterator iter=students.iterator(); iter.hasNext();) {
                Student student = (Student)iter.next();
                System.out.println(student.getName());
            }

9.N+1问题

            /**
             * 出现N+1问题
             *
             * 1:发出查询id列表的sql
             *   Hibernate: select student0_.id as col_0_0_ from t_student student0_
             *
             * N:在依次发出根据id查询Student对象的sql
             * Hibernate: select student0_.id as id1_0_, student0_.name as name1_0_,
             * student0_.createTime as createTime1_0_, student0_.classesid as classesid1_0_
             * from t_student student0_ where student0_.id=?
             * 
             */
            Iterator iter = session.createQuery("from Student").iterate();
            while(iter.hasNext()) {
                Student student = (Student)iter.next();
                System.out.println(student.getName());
            }

10.不会出现N+1问题

        try {
            session = HibernateUtils.getSession();
            session.beginTransaction();
           
            List students = session.createQuery("from Student").list();
            for (Iterator iter=students.iterator(); iter.hasNext();) {
                Student student = (Student)iter.next();
                System.out.println(student.getName());
            }
            System.out.println("---------------------------------------------");
           
            /**
             * 不会出现N+1问题
             *
             * 因为list操作已经将Student对象放到了一级缓存中,所以再次使用iterate操作的时候
             * 它首先发出一条查询id列表的sql,在根据id到缓存中去数据,只有在缓存中找不到相应的
             * 数据时,才会发出sql到数据库中查询
             *
             */
            Iterator iter = session.createQuery("from Student").iterate();
            while(iter.hasNext()) {
                Student student = (Student)iter.next();
                System.out.println(student.getName());
            }
           
            session.getTransaction().commit();
        }catch(Exception e) {
            e.printStackTrace();
            session.getTransaction().rollback();
        }finally {
            HibernateUtils.closeSession(session);
        }

11.不利用缓存,再次发出SQL语句

        try {
            session = HibernateUtils.getSession();
            session.beginTransaction();
           
            List students = session.createQuery("from Student").list();
            for (Iterator iter=students.iterator(); iter.hasNext();) {
                Student student = (Student)iter.next();
                System.out.println(student.getName());
            }
            System.out.println("---------------------------------------------");
           
            /**
             * 再次发出查询sql
             *
             * 在默认情况下list每次都会向数据库发出查询对象的sql,除非配置查询缓存,所以下面的list操作
             * 虽然在一级缓存中已经有了对象数据,但list默认情况下不会利用缓存,而再次发出sql
             *
             * 默认情况下,list会向缓存中放入数据,但不会利用数据
             *
             */
            students = session.createQuery("from Student").list();
            for (Iterator iter=students.iterator(); iter.hasNext();) {
                Student student = (Student)iter.next();
                System.out.println(student.getName());
            }
           
            session.getTransaction().commit();
        }catch(Exception e) {
            e.printStackTrace();
            session.getTransaction().rollback();
        }finally {
            HibernateUtils.closeSession(session);
        }

12.条件查询

    (1)使用?

            //可以拼字符串
            List students = session.createQuery("select s.id, s.name from Student s where s.name like '%1%'").list();
            for (Iterator iter=students.iterator(); iter.hasNext();) {
                Object[] obj = (Object[])iter.next();
                System.out.println(obj[0] + "," + obj[1]);
            }

也可以这样写:

            List students = session.createQuery("select s.id,s.name from Student s where s.name like ?)

                                                 .setPremeter(0,"%"+condition+"%")

                                                 .list();

    (2)使用 :参数

            //使用 :参数名称 的方式传递参数值
            List students = session.createQuery("select s.id, s.name from Student s where s.name like :myname")
                                       .setParameter("myname", "%1%")
                                       .list();
           
            for (Iterator iter=students.iterator(); iter.hasNext();) {
                Object[] obj = (Object[])iter.next();
                System.out.println(obj[0] + "," + obj[1]);
            }

    (3)支持in

            //支持in,需要使用setParameterList进行参数传递
            List students = session.createQuery("select s.id, s.name from Student s where s.id in(:myids)")
                                    .setParameterList("myids", new Object[]{1, 2, 3, 4, 5})
                                       .list();
           
            for (Iterator iter=students.iterator(); iter.hasNext();) {
                Object[] obj = (Object[])iter.next();
                System.out.println(obj[0] + "," + obj[1]);
            }

    (4)带有时间参数

            //查询2008年2月创建的学生
            List students = session.createQuery("select s.id, s.name from Student s where date_format(s.createTime, '%Y-%m')=?")
                                    .setParameter(0, "2008-02")
                                       .list();
            for (Iterator iter=students.iterator(); iter.hasNext();) {
                Object[] obj = (Object[])iter.next();
                System.out.println(obj[0] + "," + obj[1]);
            }

    (5)

            session.beginTransaction();
           
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
           
            //查询2008-01-10到2008-02-15创建的学生
            List students = session.createQuery("select s.id, s.name from Student s where s.createTime between ? and ?")
                                    .setParameter(0, sdf.parse("2008-01-10 00:00:00"))
                                    .setParameter(1, sdf.parse("2008-02-15 23:59:59"))
                                       .list();
            for (Iterator iter=students.iterator(); iter.hasNext();) {
                Object[] obj = (Object[])iter.next();
                System.out.println(obj[0] + "," + obj[1]);
            }
            session.getTransaction().commit();

13.分页

            session.beginTransaction();
           
            List students = session.createQuery("from Student")
                                    .setFirstResult(1)
                                    .setMaxResults(2)
                                    .list();
            for (Iterator iter=students.iterator(); iter.hasNext();) {
                Student student = (Student)iter.next();
                System.out.println(student.getName());
            }
            session.getTransaction().commit();

14.链接查询

         (1)   List students = session.createQuery("select c.name, s.name from Student s inner join s.classes c").list();
            for (Iterator iter=students.iterator(); iter.hasNext();) {
                Object[] obj = (Object[])iter.next();
                System.out.println(obj[0] + "," + obj[1]);
            }

         (2)   List students = session.createQuery("select c.name, s.name from Classes c left join c.students s").list();
            for (Iterator iter=students.iterator(); iter.hasNext();) {
                Object[] obj = (Object[])iter.next();
                System.out.println(obj[0] + "," + obj[1]);
            }

         (3)   List students = session.createQuery("select c.name, s.name from Classes c right join c.students s").list();
            for (Iterator iter=students.iterator(); iter.hasNext();) {
                Object[] obj = (Object[])iter.next();
                System.out.println(obj[0] + "," + obj[1]);
            }

15.随机日期

student.setCreateTime(randomDate("2008-01-01","2008-03-01"));

 

        /**
         * 获取随机日期
         * @param beginDate 起始日期,格式为:yyyy-MM-dd
         * @param endDate 结束日期,格式为:yyyy-MM-dd
         * @return
         */
        private static Date randomDate(String beginDate,String endDate){
            try {
                SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
                Date start = format.parse(beginDate);
                Date end = format.parse(endDate);
               
                if(start.getTime() >= end.getTime()){
                    return null;
                }
               
                long date = random(start.getTime(),end.getTime());
               
                return new Date(date);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }
       
        private static long random(long begin,long end){
            long rtn = begin + (long)(Math.random() * (end - begin));
            if(rtn == begin || rtn == end){
                return random(begin,end);
            }
            return rtn;
        }

16.DML风格

/**
 * DML风格的操作
 * @author Administrator
 *
 */
public class DMLQueryTest extends TestCase {

    public void testQuery1() {
        Session session = null;
        try {
            session = HibernateUtils.getSession();
            session.beginTransaction();
           
            session.createQuery("update Student s set s.name=? where s.id < ?")
                    .setParameter(0, "李四")
                    .setParameter(1, 5)
                    .executeUpdate();
           
            session.getTransaction().commit();
        }catch(Exception e) {
            e.printStackTrace();
            session.getTransaction().rollback();
        }finally {
            HibernateUtils.closeSession(session);
        }
    }       
}

 

 

分享到:
评论

相关推荐

    一些网页特效代码小集.pdf

    这些代码小集展示了如何利用HTML和JavaScript来创建各种网页交互效果。通过理解和应用这些代码,开发者可以提升网站的动态性和互动性,为用户提供更丰富的浏览体验。同时,需要注意的是,一些特效如弹窗和自动滚动...

    CSS常用代码小集

    在编写CSS代码时,有一些常用的代码片段频繁出现,它们能够帮助开发者提高编码效率,并解决常见的页面布局问题。下面,我将对一些常用的CSS代码片段进行详细的说明。 首先是关于换行的代码,换行在处理文本内容时是...

    当前页禁止复制粘贴截屏代码小集

    代码如下: &lt;style&gt;@media print{body{display:none}}&lt;/style&gt; &lt;&#37;–禁止截屏,通过清除剪切板实现 Start–%&gt; [removed] function clearShearPlate() { try { if (clipboardData.getData(“Text”)...

    知识小集微信小程序

    【知识小集微信小程序】 微信小程序是腾讯公司推出的一种轻量级的应用开发平台,它允许开发者在微信内创建原生体验的应用程序,无需通过应用商店即可实现快速分发和使用。这个“知识小集微信小程序”很可能是为分享...

    GAS汇编指令小集html格式

    GAS汇编指令小集GAS汇编指令小集GAS汇编指令小集GAS汇编指令小集GAS汇编指令小集GAS汇编指令小集GAS汇编指令小集

    service代码

    在`ServiceTest`中,我们可能会看到如下代码片段: ```java public class MyService extends IntentService { public MyService() { super("MyService"); } @Override protected void onHandleIntent(Intent ...

    DWR 实用例子小集

    DWR可以与Spring、Struts、Hibernate等框架集成,实现更复杂的Web应用。结合jQuery或其他JavaScript库,可以构建出更丰富的用户界面。 总的来说,“DWR实用例子小集”为开发者提供了一个实践DWR功能的平台,通过...

    FreeRTOS资料小集.CHM

    FreeRTOS资料小集.CHM

    swift-iOS知识小集

    "swift-iOS知识小集"旨在将这些碎片化的信息整合起来,方便开发者快速学习和回顾。以下是一些可能包含在该压缩包中的知识点: 1. **枚举与关联值**:Swift中的枚举不仅限于定义一组相关的常量,还能关联各种类型的...

    基于spring,struts(struts2),hibernate的web项目脚手架

    内置一个基于数据库的代码生成器rapid-generator,极易进行二次开发 struts1,struts2的零配置 spring集成及加强,自动搜索hibernate的entity annotation class 集成动态构造sql的工具:rapid-xsqlbuilder 集成...

    对联基础知识小集.pdf

    对联基础知识小集.pdf

    经典java类书籍小集

    6. **框架与库**:如Spring框架、MyBatis、Hibernate等,以及如何集成和使用它们。 最后,从文件名"04-Java类图书18-26.doc"来看,这可能是一系列Java书籍的第18到26章的内容,这些章节可能涵盖了从基础到进阶的多...

    java面试问题小集

    【Java面试问题小集】 1. **String 与 StringBuffer 的区别** String 是不可变对象,每次修改都会创建新的对象,而 StringBuffer 是可变对象,修改时不会创建新对象,因此在频繁修改字符串的情况下,使用 ...

    【CSDN首发】FreeRTOS资料小集

    资料集中的CHM文件,即“FreeRTOS资料小集”,可能包含了关于FreeRTOS的详细教程、API参考、示例代码和案例分析等内容。CHM是Microsoft的 Compiled HTML Help 文件格式,它将HTML文档合成为单个文件,便于离线阅读和...

    最新浪漫温馨短信小集.doc

    最新浪漫温馨短信小集.doc

    小学一年级期末教师评语小集.pdf

    小学一年级期末教师评语小集.pdf

    常用html图标小集1

    我的图标,收集的美丽html图标,值得收藏,准备好好收藏,以备后续使用

    ACM常用算法小集,对初学者很有帮助

    【ACM常用算法小集】是针对ACM(国际大学生程序设计竞赛)中常见的算法问题进行的总结,这些算法对于初学者来说具有很高的学习价值。下面将详细解释这些算法: 1. **组合数计算**:这是一个经典的组合数学问题,...

Global site tag (gtag.js) - Google Analytics