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
- hinernate--推荐使用原生SQL语句进行查询(效率高)
- Hibernate中使用原生的sql语句进行查询操作
- Hibernate 使用原生SQL进行查询
- Oracle使用SQL语句进行递归查询
- sql语句提高查询效率
- sql语句提高查询效率
- Hibernate使用原生SQL语句
- Hibernate使用原生SQL语句
- sql语句中一种可以代替like查询语句的效率较高的查询关键字的方法
- 如何编写效率高的SQL语句
- 提高sql语句查询效率的方法
- 怎样提高sql语句的查询效率
- hibernate开发中使用原生语句查询
- thinkphp使用原生语句多表查询
- SQL查询语句使用
- SQL查询语句使用
- SQL查询语句使用
- SQL查询语句使用
- OpenStack neutron-openvswitch-agent 启动分析
- 坑爹坑娘坑祖宗的87端口(记一次tomcat故障排查)
- 最快让你上手ReactiveCocoa之进阶篇
- MyEclipse 2015优化技巧
- JavaScript 面试题
- hinernate--推荐使用原生SQL语句进行查询(效率高)
- jsoup中select用法详解
- 获取手机通讯录信息
- 前端的一些链接
- 配置linux服务器的CATALINA_OPTS参数
- 怎样停止一个 starting 和 stoping 的服务
- Unsupported compiler 'com.apple.compilers.llvmgcc42' selected for architecture 'armv7'
- Hibernate的FlushMode与session.flush()
- 【POJ】:POJ2606,poj1118,poj2780合集