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 ...
随机推荐
- 大数据调错系列之hadoop在开发工具控制台上打印不出日志的解决方法
(1)在windows环境上配置HADOOP_HOME环境变量 (2)在eclipse上运行程序 (3)注意:如果eclipse打印不出日志,在控制台上只显示 1.log4j:WARN No appe ...
- Python学习 :面向对象 -- 类的成员
类的成员 一.字段 - 字段可以分为'普通字段'和'静态字段'两种 - 普通字段(保存在对象中,执行时只能通过对象来进行访问) - 静态字段(保存在类中,在内存中只保存一份数据(可以有效地节约内存的空 ...
- HxUtils: 批量转换换行符,print2to3
在 windows 和 linux 系统,换行符有时需要转换,其代码文件 HxUntils.py 如下: ''' HxUtils.py 2018 by x01 ''' import os, sys d ...
- UART学习之路(三)基于STM32F103的USART实验
关于STM32串口的资料可以在RM0008 Reference Manual中找到,有中文版的资料.STM32F103支持5个串口,选取USART1用来实验,其对应的IO口为PA9和PA10.这次的实 ...
- C语言——第一章,1.4程序开发过程
1.4程序开发过程 一,开发过程 1,分析问题,设计一种解决问题的途径(方案)★ 2,写出源代码 (*.c) 3,编译→(连接) *.obj→(*.exe) 4,运行*.exe (可执行程序) 二 ...
- SSIS平台下的对象和概念
包即经检索.执行和保存的工作单元,是最重要的 Integration Services 对象. 控制流元素(任务和容器),用于在包中生成控制流.控制流元素准备或复制数据,与其他进程进行交互,或实现重复 ...
- 5.18-笨办法学python-习题16(write)
from sys import argv script,filename=argv #固定模式啦 print("we're going to erase %r."%filename ...
- Java程序设计 第16周 课堂实践 —— 数据库3
Java程序设计 第16周 课堂实践 -- 数据库3 课堂实践任务3 查询world数据库,获得New Jessey州所有城市的总人口数. 代码分析 实现查询数据库需要我们修改MessageDAO.j ...
- sql语句-6-更新数据
- 优步UBER司机全国各地奖励政策汇总:北京、上海、广州、深圳、佛山、天津、南京、武汉、成都、重庆、济南、西安、宁波、青岛、长沙、苏州
Uber当周奖励政策 当前奖励包括:高峰翻倍奖励.行程奖励.金牌司机奖励 获得任何奖励的前提条件: 当周评分高于4.7分,当周成单率高于45%,且当周完成至少5单(含5单) 滴滴快车单单2.5倍,注册 ...