hinernate--推荐使用原生SQL语句进行查询(效率高)

来源:互联网 发布:整装好还是基装好 知乎 编辑:程序博客网 时间:2024/06/05 22:51

需要注意以下几点:

1 select * from t_stu where name like ?

注意要加上这个addEntity 因为默认返回Obect数组  注意addEntity()里面的对象都是可以进行持久化的数据库对象  DTO对象不可以使用这个方法

            session = HibernateUtil.openSession();            List<Student> ls = session.createSQLQuery("select * from t_stu where name like ?")                                .addEntity(Student.class)//注意要加上这个addEntity 因为默认返回Obect数组                                .setFirstResult(0).setMaxResults(7)                                .setParameter(0, "%张%").list();            for (Student student : ls)            {                System.out.println(student.getName());            }

2加入我有三个存在冗余的表,也存在对应对象,如果我想把这三个表查询出来的东西 放到一起进行传输(不可能建立一个超大的冗余表 把那三个全部存起来 不然那三个表就没有意义了) 我们可以新建一个类DTO 包含那三个对象 用于传输  ,可以使用原生SQL 通过一条语句查询出三个对象  返回一个Object数组

 @Test    public void test02()    {        /*         * 此种为DTO里面全是不同冗余类的组合         * 使用DTO StudentClassroomSpecial来实现冗余表对象的打包封装         */        Session session = null;        Transaction trans = null;        try        {            session = HibernateUtil.openSession();            //注意这里要加{}比较智能 不加括号的话 会默认为stu            List<Object[]> ls = session.createSQLQuery("select {stu.*},{cla.*},{spec.*} "                + " from t_stu stu left join t_cla cla"                + " on(stu.cid=cla.id) left join t_spec spec on(cla.spec_id=spec.id) where stu.name like ?")                                .addEntity("stu",Student.class)//这些增加的实体对象 都是存储在数据库中的 @entity                                .addEntity("cla",Classroom.class)                                .addEntity("spec",Special.class)                                .setFirstResult(0).setMaxResults(7)                                 .setParameter(0, "%张%").list();            //创建DTO list 去接住            List<StudentClassroomSpecial> list=new ArrayList<StudentClassroomSpecial>();            Student stu=null;            Classroom cla=null;            Special spec=null;              for (Object[] obj : ls)            {                stu=(Student)obj[0];                cla=(Classroom)obj[1];                spec=(Special)obj[2];                list.add(new StudentClassroomSpecial(stu,cla,spec));            }            for (StudentClassroomSpecial scs : list)            {                System.out.println(scs.getStu().getName()+" "+scs.getCla().getName()+" "+scs.getSpec().getName());            }                    }        catch (HibernateException e)        {            e.printStackTrace();        }        finally        {            if (null != session)                HibernateUtil.closeSession(session);        }    }

3如果是想使用一个类 里面可以包含自己查出来的不同字段  用于传输  ,

在HQL中查询时候使用 new 类的完整包名( as , as ,as )这样使用,在原生SQL中可以使用

setResultTransformer(Transformers.aliasToBean(StudentDto.class)

注意对应的类要写构造方法 和默认构造方法 还有查询时候写上...as...as

 @Test    public void test03()    {        /*         * 此种为DTO里面全是不同的冗余字段的组合 注意写对应构造方法         *   test03 .setResultTransformer()         *                    *   注意:不能addEntity 因为这样add的都输数据库中的类表 而DTO是传输用的 不需要再数据库中         */        Session session = null;        Transaction trans = null;        try        {            session = HibernateUtil.openSession();            List<StudentDto> ls = session.createSQLQuery("select stu.id as sid,stu.name as sname,"                + "stu.sex as sex,cla.name as cname,spec.name as specname  "                + " from t_stu stu left join t_cla cla"                + " on(stu.cid=cla.id) left join t_spec spec on(cla.spec_id=spec.id) where stu.name like ?")                                .setResultTransformer(Transformers.aliasToBean(StudentDto.class))                                .setFirstResult(0).setMaxResults(7)                                 .setParameter(0, "%张%").list();            for (StudentDto studentDto : ls)            {                System.out.println(studentDto);            }                    }        catch (HibernateException e)        {            e.printStackTrace();        }        finally        {            if (null != session)                HibernateUtil.closeSession(session);        }    }
public class StudentClassroomSpecial{    private Student stu;    private Classroom cla;    private Special spec;            public StudentClassroomSpecial()    {    }    public StudentClassroomSpecial(Student stu, Classroom cla, Special spec)    {        this.stu = stu;        this.cla = cla;        this.spec = spec;    }    public Student getStu()    {        return stu;    }    public void setStu(Student stu)    {        this.stu = stu;    }    public Classroom getCla()    {        return cla;    }    public void setCla(Classroom cla)    {        this.cla = cla;    }    public Special getSpec()    {        return spec;    }    public void setSpec(Special spec)    {        this.spec = spec;    }    }

public class StudentDto{    private int sid;    private String sname;    private String sex;    private String cname;    private String specname;            /**      * <DTO 对象 不用于传输 仅仅用于存储>     */    public StudentDto()    {    }    public StudentDto(int sid, String sname, String sex, String cname, String specname)    {        this.sid = sid;        this.sname = sname;        this.sex = sex;        this.cname = cname;        this.specname = specname;    }    public int getSid()    {        return sid;    }    public void setSid(int sid)    {        this.sid = sid;    }    public String getSname()    {        return sname;    }    public void setSname(String sname)    {        this.sname = sname;    }    public String getSex()    {        return sex;    }    public void setSex(String sex)    {        this.sex = sex;    }    public String getCname()    {        return cname;    }    public void setCname(String cname)    {        this.cname = cname;    }    public String getSpecname()    {        return specname;    }    public void setSpecname(String specname)    {        this.specname = specname;    }    @Override    public String toString()    {        return "StudentDto [sid=" + sid + ", sname=" + sname + ", sex=" + sex + ", cname=" + cname + ", specname="            + specname + "]";    }    }



0 0
原创粉丝点击