Hibernate(九)
三套查询之SQL查询
Native Sql Query原生的sql查询.
要求写sql语句.
SQLQuery 是 Query的子类
1.查询所有的学生
//1.查询所有的学生
@Test
public void test1(){
SQLQuery sqlQuery = session.createSQLQuery("select * from student");//student是表名,不是类名
sqlQuery.addEntity(Student.class);
List<Student> list = sqlQuery.list();
for (Student student : list) {
System.out.println(student.getId()+student.getName()+student.getTeacher().getTname());
}
System.out.println("========================================");
SQLQuery sqlQuery2 = session.createSQLQuery("select s.* from student s where s.id%2=0");//student是表名,不是类名
sqlQuery2.addEntity("com.rong.entity.sql.Student");
List<Student> list2 = sqlQuery2.list();
for (Student student : list2) {
System.out.println(student.getId()+student.getName()+student.getTeacher().getTname());
} }
2.标量查询
//2.标量查询
@Test
public void test2(){
SQLQuery sqlQuery = session.createSQLQuery("select s.java,s.math,s.name from student s where s.name like ?");
sqlQuery.setParameter(0, "%a%");
List<Object[]> list = sqlQuery.list();
for (Object[] objects : list) {
for (Object object : objects) {
System.out.print(object+"\t");
}
System.out.println();
}
System.out.println("=========================================");
SQLQuery sqlQuery2 = session.createSQLQuery("select * from student s");
sqlQuery2.addScalar("s.id");
sqlQuery2.addScalar("s.name");
List<Object[]> list2 = sqlQuery2.list();
for (Object[] objects : list2) {
for (Object object : objects) {
System.out.print(object+"\t");
}
System.out.println();
}
}
3.关联查询
//3.关联查询
@Test
public void test3(){
SQLQuery sqlQuery = session.createSQLQuery("select * from student s,teacher t where s.t_id=t.tid");
sqlQuery.addEntity("s",Student.class);// 实体查询
sqlQuery.addEntity("t",Teacher.class);// 实体查询
sqlQuery.addJoin("t", "s.teacher");// 关联查询 (s.学生持久类中的关联属性)
/*sqlQuery.addScalar("s.name");// 标量查询
sqlQuery.addScalar("t.tname");// 标量查询
List<Object[]> list = sqlQuery.list();
for (Object[] objects : list) {
for (Object object : objects) {
System.out.print(object);
}
System.out.println();
}*/
List<Object[]> list = sqlQuery.list();
for (Object[] objects : list) {
for (Object object : objects) {
if(object instanceof Student){
Student student=(Student) object;
System.out.println(student.getId()+student.getName()+student.getTeacher().getTname());
}else if(object instanceof Teacher){
Teacher teacher=(Teacher) object;
System.out.println(teacher.getTid()+teacher.getTname());
}
}
System.out.println();
}
}
4.命名查询
A.第一种方式*hbm.xml
1.提供一个配置文件. (xxx.hbm.xml).

2.在hibernate.cfg.xml文件中配置xxx.hbm.xml.

3.定义sql
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping SYSTEM "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd" >
<hibernate-mapping>
<sql-query name="sql_query">
select s.*,t.*
from student s,teacher t
where s.t_id=t.tid
<!-- addEntity: 实体查询 -->
<return alias="s" class="com.rong.entity.sql.Student"></return>
<return alias="t" class="com.rong.entity.sql.Teacher"></return>
<!-- addJoin : 关联查询 -->
<return-join alias="t" property="s.teacher"></return-join>
<!-- addScalar : 标量查询 -->
<return-scalar column="s.name"/>
<return-scalar column="t.tname"/>
</sql-query>
</hibernate-mapping>
4.代码
@Test
public void test4(){
Query query = session.getNamedQuery("sql_query");
List<Object[]> list = query.list();
for (Object[] objects : list) {
for (Object object : objects) {
System.out.println(object);
}
System.out.println();
}
}
B.第二种方式: (在持久化类上加注解).
package com.rong.entity.sql; import javax.persistence.ColumnResult;
import javax.persistence.Entity;
import javax.persistence.EntityResult;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedNativeQueries;
import javax.persistence.NamedNativeQuery;
import javax.persistence.SqlResultSetMapping; @Entity
//单个SQL语句,一个实体类中该注解只能使用一次
@NamedNativeQuery(name = "sql1", query = "select * from student s,teacher t "
+ "where s.t_id=t.tid",resultClass=Student.class)
//多个SQL语句
@NamedNativeQueries(value = { @NamedNativeQuery(name = "sql2", query = "select * from student s,teacher t where s.t_id=t.tid and s.name like ?"
,resultSetMapping="rs")
,@NamedNativeQuery(name = "sql3", query = "select s.java from student s where s.id>90")})
@SqlResultSetMapping(name = "rs",entities={@EntityResult(entityClass = Student.class)
,@EntityResult(entityClass = Teacher.class)},columns=@ColumnResult(name = "s.name"))
public class Student {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
private String name;
private int math;
private int java;
@ManyToOne(targetEntity=Teacher.class,fetch=FetchType.LAZY)
@JoinColumn(name="t_id",referencedColumnName="tid")
private Teacher teacher;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getMath() {
return math;
}
public void setMath(int math) {
this.math = math;
}
public int getJava() {
return java;
}
public void setJava(int java) {
this.java = java;
}
public Teacher getTeacher() {
return teacher;
}
public void setTeacher(Teacher teacher) {
this.teacher = teacher;
}
}
@Test
public void test5(){
Query query = session.getNamedQuery("sql1");
List<Student> list = query.list();
for (Student student : list) {
System.out.println(student.getName()+student.getTeacher().getTname());
}
System.out.println("==============================");
Query query2 = session.getNamedQuery("sql2");
query2.setParameter(0, "%a%");
List<Object[]> list2 = query2.list();
for (Object[] objects : list2) {
for (Object object : objects) {
System.out.println(object);
}
System.out.println();
}
System.out.println("================================");
Query query3 = session.getNamedQuery("sql3");
List<Object> list3 = query3.list();
for (Object object : list3) {
System.out.println(object);
}
}
Hibernate(九)的更多相关文章
- Hibernate(九)HQL查询
一.Hibernate提供的查询方式 OID查询方式:主键查询.通过get()或者load()方法加载指定OID的对象查询结果为一个 HQL查询方式:通过Query接口使用HQL语言进行查询 QBC查 ...
- hibernate(九) 二级缓存和事务级别详讲
序言 这算是hibernate的最后一篇文章了,下一系列会讲解Struts2的东西,然后说完Struts2,在到Spring,然后在写一个SSH如何整合的案例.之后就会在去讲SSM,在之后我自己的个人 ...
- Hibernate(九)__OpenSessionInView解决懒加载问题
什么是OpenSessionInView? 在hibernate中使用load方法时,并未把数据真正获取时就关闭了session,当我们真正想获取数据时会迫使load加载数据,而此时session已关 ...
- Hibernate(九)--N+1问题
1.在利用Hibernate操作数据库的时候,如果在实体类上设置了表的双向关联.这可能会出现Hibernate N+1的问题. 1.1.一对多: 在一方,查找得到了 n 个对象,那么又需要将 n 个对 ...
- SSH框架的多表查询和增删查改 (方法一)中
原创作品,允许转载,转载时请务必标明作者信息和声明本文章==>http://www.cnblogs.com/zhu520/p/7774144.html 这边文章是接的刚刚前一遍的基础上敲的 ...
- (Hibernate进阶)Hibernate系列——总结篇(九)
这篇博文是hibernate系列的最后一篇,既然是最后一篇,我们就应该进行一下从头到尾,整体上的总结,将这个系列的内容融会贯通. 概念 Hibernate是一个对象关系映射框架,当然从分层的角度看,我 ...
- J2EE进阶(十九)FileNotFoundException: http://hibernate.org/dtd/hibernate-mapping-3.0.dtd
J2EE进阶(十九)Nested exception: java.io.FileNotFoundException: http://hibernate.org/dtd/hibernate-mappin ...
- 【SSH进阶之路】Hibernate系列——总结篇(九)
这篇博文是Hibernate系列的最后一篇,既然是最后一篇,我们就应该进行一下从头到尾,整体上的总结,将这个系列的内容融会贯通. 概念 Hibernate是一个对象关系映射框架,当然从分层的角度看,我 ...
- hibernate(九)多对多关联
原文链接:http://www.orlion.ml/29/ 一.多对多单向关联 假设一个老师教多个学生,一个学生被多个老师教,这就是典型的多对多关系 配置方式是在Teacher类的getStudent ...
- 攻城狮在路上(壹) Hibernate(九)--- Hibernate的映射类型
Hibernate采用映射类型作为Java类型和SQL类型的桥梁,对应type属性.分为两种:内置映射类型和客户化映射类型.一.内置映射类型: 1.Java基本类型的Hibernate映射类型: Ja ...
随机推荐
- python3 实现一个多级菜单小功能
记录下一下 #!/usr/bin/env python3 ''' 需求:三级菜单 三级菜单,依次进入子菜单 ''' City = { '北京':{ '大兴区':[ '亦庄','黄村','中信新城',' ...
- Matlab调用C语言函数
Matlab调用C语言函数 如果我有一个用C语言写的函数,实现了一个功能,如一个简单的函数:double add(double x, double y) { return x + y ;}现在我想要在 ...
- 20155337 2016-2017-2 《Java程序设计》第一周学习总结
20155337 2016-2017-2 <Java程序设计>第一周学习总结 教材学习内容总结 我们主要学习的是JAVA SE平台也就是标准平台-Java SE四个组成部分:JVM .JR ...
- day 9 名字管理系统
1 while True ##### 布尔值:True or False In [8]: a = 19 In [6]: a > 18 Out[6]: True In [7]: a < 18 ...
- Yii2 使用 faker 生成假数据
测试过程中有时候需要生成大量的假数据,faker 是一个生成假数据的类库,可以生成姓名,电话,IP地址,密码,ISBN等等你能想到的或者你想不到的各种类型的假数据. Yii2.0已经集成该类库,不用再 ...
- kallsyms , addr to symbol
#!/usr/bin/env python # addr2sym.py - resolve addresses to symbols, using a map file # Reads a log f ...
- Jenkins单元测试
Jenkins提供了一个开箱即用功能来选择JUnit,并提供了一系列的插件进行单元测试等技术,一个例子是 MSTest 的.Net单元测试.如果你打下面的链接 https://wiki.jenkins ...
- Unity Lighting - Reflections 反射(六)
Reflections 反射 Reflection Source 反射源 By default, objects in a scene are rendered using Unity’s ‘St ...
- Phaser3让超级玛丽实现轻跳、高跳及加上对应的跳跃声音
mario jumper 在线测试地址:http://www.ifiero.com/uploads/phaserjs3/jumper/ 空格键:轻按:跳低 ,长按:跳高键盘:--> 向右 , ...
- python学习笔记01 --------------hello world 与变量。
1.第一个程序: print('hello world') 输出结果: hello world 2.变量 2.1 变量的作用: 把程序运算的中间结果临时存到内存里,以备后面的代码继续调用. 2.2 变 ...