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 ...
随机推荐
- 如何在HHDI中调用Java文件
创建执行JS语句任务,在脚本中输入相关代码,两种写法: ------------------------写法一 // 直接调用类的路径 var now = com.haohe.utils.DateUt ...
- fdisk 命令总结
fdisk 侧重点是如何将一块硬盘,进行分区,格式化然后使用 fdisk --help 或者man fdisk可以帮助我们快速上手 划分sdb这块硬盘 1.fdisk /dev/sdb 进行分区 2. ...
- 【C】对指针表达式的个人总结与思考
本文内容参考<c 和 指针>. 声明:本博文只为那些能沉得住气,认真研究,探索真知的人参考,浮躁的人请离开,因为看不懂. 感觉以前学c的时候,学的指针真是白学了,今天看到这个内容,困惑后, ...
- BZOJ 4326: NOIP2015 运输计划(二分,树上差分)
Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 1945 Solved: 1243[Submit][Status][Discuss] Descript ...
- Linux下c语言实现myod
首先根据od要输出16进制的功能,以及c语言中文件的打开读取等函数,编写了如下代码. #include<stdio.h> #define N 1000 int main() { int c ...
- 【CF960G】Bandit Blues
[CF960G]Bandit Blues 题面 洛谷 题解 思路和这道题一模一样,这里仅仅阐述优化的方法. 看看答案是什么: \[ Ans=C(a+b-2,a-1)\centerdot s(n-1,a ...
- 【Windows定时关机】windows实现定时关机与取消
背景:本人昨晚本来打算将电脑设置为晚上12点 30定时关机,结果写成了:12:30,所以就在刚才,我正玩游戏的时候, 电脑弹出提示:“windows将在一分钟内关闭”,我刚开始一脸懵逼,后来打开昨天敲 ...
- 帮你理解学习lambda式
概要 窗前明月光,疑是地上霜,举头望明月,低头思故乡.别误会这是开头诗与以下文章没任何关系. 今天我想给大家说道说道 C# lambda表达式,不废话,下面开始说道! lambda lambd ...
- 2019年猪年颁奖典礼、公司年会、跨年晚会、科技会议、年终答谢会之幕布背景展板PSD模板-第三部分
16套--2019年猪年颁奖典礼.公司年会.跨年晚会.科技会议.年终答谢会之幕布.背景和展板PSD模板,免费颁奖典礼PSD展板背景幕布,下载地址:百度网盘,https://pan.baidu.com/ ...
- PHP序列化serialize()和反序列化unserialize()
所谓的序列化,就是把保存在内存中的各种对象状态或属性保存起来,在需要时可以还原出来. serialize() 可处理除了 resource 之外的任何类型返回字符串,此字符串包含了表示 value 的 ...