zoukankan      html  css  js  c++  java
  • Hibernate ORM框架——Hibernate查询之Criteria接口、Native SQL 查询、Query接口(批量操作)

    一、使用双向一对多,多对一的案例

    util包不变、映射文件、配置文件不变

    添加了一个实体(用于setResultTransformer):

    package shuang.m2oo2m;
    
    public class PersonClassInfo {
        private String pname;
        private String cname;
        
        public String getPname() {
            return pname;
        }
        public void setPname(String pname) {
            this.pname = pname;
        }
        public String getCname() {
            return cname;
        }
        public void setCname(String cname) {
            this.cname = cname;
        }
        @Override
        public String toString() {
            return "PersonClassInfo [pname=" + pname + ", cname=" + cname + "]";
        }
        
        
    }

    Main测试

    package com.nf;
    
    import java.util.List;
    import java.util.Map;
    
    import org.hibernate.Criteria;
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.Transaction;
    import org.hibernate.criterion.Criterion;
    import org.hibernate.criterion.Restrictions;
    import org.hibernate.query.NativeQuery;
    import org.hibernate.query.Query;
    import org.hibernate.transform.Transformers;
    
    import shuang.m2oo2m.Person;
    import shuang.m2oo2m.PersonClassInfo;
    import util.HibernateUtil;
    
    public class Main {
    
        public static void main(String[] args) {
            
            /*Criteria接口,单个模糊查询,组合类型模糊查询*/
            queryByCriteria();
            
            /*本地查询:即使用select语句查询*/
            //nativeQuery() ;
            
            /*本地查询:自己写的select查询语句:多表查询*/
            //nativeQueryTransformer();
            
            //批量添加、删除
            batchProcess();
        }
    
        private static void template() {
            SessionFactory sf = HibernateUtil.getSessionFactory();
            Session s = sf.openSession();
            Transaction tx = s.beginTransaction();
    
            tx.commit();
            s.close();
            sf.close();
        }
    
    
        // ********************过滤条件*************************
        // 过滤条件值是固定的
        private static void fixedWhereQuery() {
            SessionFactory sf = HibernateUtil.getSessionFactory();
            Session s = sf.openSession();
            Transaction tx = s.beginTransaction();
    
            String hql = "select p from Person p where p.name='p111'";
    
            Query q = s.createQuery(hql);
            List<Person> list = q.list();
            for (Person p : list) {
                System.out.println(p);
            }
            tx.commit();
            s.close();
            sf.close();
        }
    
    
        //Criteria接口主要是针对查询条件进行的操作
        //第一个Criteria接口案例-->like
        private static void queryByCriteria() {
            SessionFactory sf = HibernateUtil.getSessionFactory();
            Session s = sf.openSession();
            Transaction tx = s.beginTransaction();
    
            Criteria c = s.createCriteria(Person.class);
            // 构造函数是受保护的,所以不能直接实例化
            //    Criterion guolv = new LikeExpression("name","abc");
            /*
             * 拓展:构造函数受保护的解决方案:
             * (1)直接:在自己的类中写一个父类静态的方法、方便调用
             * (2)间接:借用别人写好的工具类,里面写好的调用方法
             * */
            
            /*模糊查询:*/
            Criterion guolv = Restrictions.like("name","p%");
            c.add(guolv);
            
            /*组合类型:Restrictions.and*/
            /*
            Criterion startWithP = Restrictions.like("name", "p%");
            Criterion endWith5 = Restrictions.like("name", "%5");
            Criterion guolv = Restrictions.and(startWithP,endWith5);
            
            c.add(guolv);
            */
            
            List<Person> result = c.list();
            for(Person p: result) {
                System.out.println(p);
            }
            tx.commit();
            s.close();
            sf.close();
        }
        
        /*本地查询:即使用select语句查询*/
        private static void nativeQuery() {
            SessionFactory sf = HibernateUtil.getSessionFactory();
            Session s = sf.openSession();
            Transaction tx = s.beginTransaction();
            
            NativeQuery q =  s.createNativeQuery("select * from persons", Person.class);
        
            List<Person> result = q.list();
            for(Person p: result) {
                System.out.println(p);
            }
            tx.commit();
            s.close();
            sf.close();
        }
        
        /*本地查询:自己写的select查询语句:多表查询*/
        private static void nativeQueryTransformer() {
            SessionFactory sf = HibernateUtil.getSessionFactory();
            Session s = sf.openSession();
            Transaction tx = s.beginTransaction();
            
            NativeQuery q =  s
                    .createNativeQuery("select persons.name as pname,CLASSINFO.name as cname from persons inner join classInfo on persons.rci = CLASSINFO.cid");
            q.setResultTransformer(Transformers.aliasToBean(PersonClassInfo.class));//为的是知道是哪个类
            
            List<PersonClassInfo> result = q.list();
            for(PersonClassInfo p: result) {
                System.out.println(p);
            }
            
            tx.commit();
            s.close();
            sf.close();
        }
        
        
        /*批量添加删除
         * batch批量的意思
         * Hibernate 对update,delete操作支持比较好
         * 而且hql的update,delete主要用来批量处理的
         * 但是对insert操作,支持就有限制
         * 不支持insert into xxx(id,name) values(1,'sss')
         * 但其支持的是insert into xxx(id,name) select
         */
        private static void batchProcess() {
            SessionFactory sf = HibernateUtil.getSessionFactory();
            Session s = sf.openSession();
            Transaction tx = s.beginTransaction();
            
            String hql = "update Person p set p.name = p.name + 'abc'  ";
            Query q = s.createQuery(hql);
            q.executeUpdate();
            
            tx.commit();
            s.close();
            sf.close();
        }
    }
  • 相关阅读:
    Pytorch cpu版离线安装:win10 + Anaconda + Pip
    离线配置Opencv-python: Anaconda3 + Pycharm+ Win10 + Python3.6
    HSmartWindowControl 之 摄像头实时显示( 使用 WPF )
    OpencvSharp 在WPF的Image控件中显示图像
    HSmartWindowControl 之 显示图像
    HSmartWindowControl之安装篇 (Visual Studio 2013 & Halcon 18)
    使用ILMerge 打包C# 绿色免安装版程序
    C# 日志输出工具库—log4net 安装、配置及简单应用
    Python:windows下scikit-learn 安装和更新
    C# 开源仪表盘库—Agauge App
  • 原文地址:https://www.cnblogs.com/Sunny-lby/p/7428127.html
Copyright © 2011-2022 走看看