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 ...
随机推荐
- 大数据:Map终结和Spill文件合并
当Mapper没有数据输入,mapper.run中的while循环会调用context.nextKeyValue就返回false,于是便返回到runNewMapper中,在这里程序会关闭输入通道和输出 ...
- x01.polls: 学习 django
开发一个 Web 应用:x01.polls,可能比想像的还要容易一些,这完全得益于 django 框架. 1.安装 django: sudo pip3 install django 2.阅读 djan ...
- 20155325 2016-2017-2 《Java程序设计》第3周学习总结
教材学习内容总结 别用==直接比较浮点数运算结果. Integer默认值-128到127,若超出,需要修改系统属性,所以最好通过equals()比较. 系统错误提示:若超出数组范围,则显示ArrayI ...
- echarts 去掉上面的小图标
在option里找到toolbox,删除对应的代码即可: toolbox: { y : -30, show : true, feature : { mark : '辅助线开关', markUndo : ...
- swift3.0通过响应链获取当前试图的控制器
func parentViewController() -> UIViewController? { let n = next while n != nil { let controller = ...
- 【LG3234】[HNOI2014]抄卡组
题面 题解 分三种情况: 若所有串都没有通配符,直接哈希比较即可. 若所有串都有通配符, 把无通配符的前缀 和 无通配符的后缀哈希后比较即可. 中间部分由于通配符的存在,一定可以使所有串匹配. 若部分 ...
- ELKStack入门篇(四)之Filebeat
Filebeat是轻量级单用途的日志收集工具,用于在没有安装java的服务器上专门收集日志,可以将日志转发到logstash.elasticsearch或redis等场景中进行下一步处理. 官方文档: ...
- mysqldump: Got errno 28 on write(mysql)
使用mysqldump进行数据库备份的时候,出现下面的错误 mysqldump: Got errno 28 on write 上网查了一下:出现这个错误,是因为磁盘的空间不足 再看系统空间使用 ...
- 七、Django之Views
一.概述 视图就是python中的函数,我们通常也称为:视图函数. 视图一般被定义在“app/views.py”中. 视图负责接受Web请求(HttpRequest)URL,进行逻辑处理,并返回Web ...
- tp框架-------验证码
验证码我们一般很常见,在注册或登录时,都可以用的到,下面我们就来看看它的代码和用法 加验证码是为了防止表单攻击的一种方式,为了我们的程序更加的安全 在tp框架中它自带了一个验证码的类,我们先来看一下 ...