在《【Hibernate】Hibernate的聚类查询、分组查询、排序与时间之差》(点击打开链接)一文中已经讲述过怎样利用HQL语句代替SQL语句。进行聚类查询、分组查询、排序与时间之差的查询,同一时候指出hql能代替sql语句做不论什么事情。我原本以为hql语句的多表查询,要先对里面的实体做Java与xml的改动,事实上并不须要,相同是一句HQL语句就能搞定的事情。SQL的多表查询已经在《【Mysql】利用内连接与嵌套查询实现多表查询。主键、外键的基本概念》(点击打开链接)讲过。

比方例如以下的SQL语句:

select t1.Title,t1.Content
from blog as t1 ,usertable as t2
where t1.userid=t2.id and t2.username='a'

转换成HQL语句则例如以下:

String hql="select t1.title,t1.content from Blog as t1,Usertable as t2 where t1.userId=t2.id and t2.username='a'"
List<Object> resultList = session.createQuery(hql).list();
for (int i = 0; i < resultList.size(); i++) {
Object[] obj = (Object[])resultList.get(i);
System.out.println(obj[0]+","+obj[1]);
}

核心思想,是把sql语句中的表,写成Hibernate的实体。sql语句中的字段、列,写成Hibernate的实体的成员变量,同一时候必须把表使用as进行t1,t2等标记,不能使用Blog.XX字段来简化。如上,就是Blog,Usertable两张表转化为t1,t2标记,把sql的字段、列,表相应转化为Hibernate的实体成员变量,实体进行查询。

Hibernate查询出来的结果是一个存放Object数组的List,也就是说List的每项都是一个Object数组,Object数组的第n项相应查询结果的第n项。

能够再进行下一步的处理。

以下用一个样例,来说明HQL语句的多表查询。

如图,Blog记录了用户发表的博客,usertable记录了用户的基本信息。

Blog表中的userid与usertable的主键id形成參照完整性。

这两张表在Hibernate的Javaproject种分别相应例如以下实体:

Blog.java

import javax.persistence.*;

@Entity
@Table(name = "blog")
public class Blog {
private int id;
private String title;
private String content;
private int userId; @Id
@GeneratedValue
public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} @Column(name = "Title")
public String getTitle() {
return title;
} public void setTitle(String title) {
this.title = title;
} @Column(name = "Content")
public String getContent() {
return content;
} public void setContent(String content) {
this.content = content;
} @Column(name = "userid")
public int getUserId() {
return userId;
} public void setUserId(int userId) {
this.userId = userId;
} @Override
public String toString() {
return id + "," + title + "," + content + "," + userId;
} }

Usertable.java

import javax.persistence.*;

@Entity
@Table(name = "usertable")
public class Usertable {
private int id;
private String username;
private String password; @Id
@GeneratedValue
public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} @Column(name = "username")
public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} @Column(name = "password")
public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
} @Override
public String toString() {
return id + "," + username + "," + password;
}
}

同一时候,hibernate.cfg.xml做例如以下的配置:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!--所用的数据库驱动 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<!--所用的数据库登录password -->
<property name="hibernate.connection.password">admin</property>
<!--所用的数据库名称为test,依据实际更改 -->
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test</property>
<!--所用的数据库用户名 -->
<property name="hibernate.connection.username">pc</property>
<!--所用的数据库方言,与所用数据库驱动一样,能够在网上查到。这里是mysql -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
<property name="hibernate.format_sql">true</property>
<!--假设是update表明Hibernate将保留原来的数据记录,插入时把新记录加入到已有的表, -->
<!--假设是create。则总是创建新的表,假设原来数据库已有的这个表。则这个表的记录会被所有清洗 -->
<property name="hibernate.hbm2ddl.auto">update</property>
<!--罗列Testtable表与Java文件的映射 -->
<!--将数据库中的usertable表,blog表映射到Usertable.java与Blog.java两个实体 -->
<mapping class="Usertable" />
<mapping class="Blog" />
</session-factory>
</hibernate-configuration>

能够发现,这没有进行不论什么的參照完整性的指定。

以下,要查询usertable中username为a的用户。发表的Blog。

我们知道先要查询username为a的用户的id。之后利用这个查出来的id到Blog表中查询。

用sql语句完毕这个多表查询,则这样写:

select t1.Title,t1.Content
from blog as t1 ,usertable as t2
where t1.userid=t2.id and t2.username='a'

其查询结果例如以下:

这使用Hibernate则这样写,在HibernateMultiTableTest.java中的代码例如以下:

import java.util.List;

import org.hibernate.*;
import org.hibernate.cfg.*; class dbDAO {
private Session session; // 构造函数,初始化Session,相当于连接数据库
public dbDAO() {
// new Configuration().configure()是吧hibernate.cfg.xml中的全部配置读取进来
// .buildSessionFactory().openSession()是创建Session工厂并实例化session
this.session = new Configuration().configure().buildSessionFactory()
.openSession();
} // 运行查询
public Query query(String hql) {
return session.createQuery(hql);
} // 运行插入、改动
public void save(Object object) {
Transaction transaction = session.beginTransaction();
session.save(object);
transaction.commit();
} // 运行删除
public void delete(Object object) {
Transaction transaction = session.beginTransaction();
session.delete(object);
transaction.commit();
} // 析构函数,中断Session,相当于中断数据库的连接
protected void finalize() throws Exception {
if (session.isConnected() || session != null) {
session.close();
}
} } @SuppressWarnings("unchecked")
public class HibernateMultiTableTest {
public static void main(String args[]) {
dbDAO db = new dbDAO();
List<Object> resultList = db
.query("select t1.title,t1.content from Blog as t1,Usertable as t2 where t1.userId=t2.id and t2.username='a'")
.list();//HQL的多表查询
System.out.println("usertable中username为a的用户,发表的内容例如以下:");
System.out.println();
for (int i = 0; i < resultList.size(); i++) {
Object[] obj = (Object[]) resultList.get(i);
System.out.println("标题:" + obj[0]);
System.out.println("内容:" + obj[1]);
System.out.println();
}
}
}

其运行结果例如以下:

【Hibernate】Hibernate的多表查询的更多相关文章

  1. Hibernate中的多表查询及抓取策略

    1.Hibernate中的多表查询 1.1SQL中的多表查询 [交叉连接] select * from A,B; [内连接] 显示内连接:inner join(inner 可以省略) Select * ...

  2. Hibernate的HQL多表查询

    HQL的内连接查询 对于HQL内链接查询,查询的是两张表的数据,这两张表的数据首先是保存在数组之中,然后在将每一个数组保存在List集合之中进行返回 代码片段: @Test // 内连接 public ...

  3. Hibernate学习---单表查询

    我们都知道SQL是非常强大的,为什么这么说呢?相信学过数据库原理的同学们都深有体会,SQL语句变化无穷,好毫不夸张的说可以实现任意符合我们需要的数据库操作,既然前面讲到Hibernate非常强大,所以 ...

  4. hibernate多表查询封装实体

    以前用sql实现联合查询 是非常简单的事,只需要写sql语句就可以,第一次遇到hibernate要实现多表联合查询的时候还楞了一下.最后看了下资料,才恍然大悟,hibernate实现多表联合查询跟SQ ...

  5. Java面试题:Hibernate的二级缓存与Hibernate多表查询

    我们来看两个有关Java框架之Hibernate的面试题,这是关于Hibernate的常考知识点. 1.请介绍一下Hibernate的二级缓存 解题按照以下思路来回答: (1)首先说清楚什么是缓存: ...

  6. hibernate框架学习之多表查询helloworld

    package cn.itcast.h3.hql; import java.util.List; import org.hibernate.Query; import org.hibernate.Se ...

  7. Spring Hibernate JPA 联表查询 复杂查询(转)

    今天刷网,才发现: 1)如果想用hibernate注解,是不是一定会用到jpa的? 是.如果hibernate认为jpa的注解够用,就直接用.否则会弄一个自己的出来作为补充. 2)jpa和hibern ...

  8. Hibernate中的HQL的基本常用小例子,单表查询与多表查询

    <span style="font-size:24px;color:#3366ff;">本文章实现HQL的以下功能:</span> /** * hql语法: ...

  9. Spring Hibernate JPA 联表查询 复杂查询

    今天刷网,才发现: 1)如果想用hibernate注解,是不是一定会用到jpa的? 是.如果hibernate认为jpa的注解够用,就直接用.否则会弄一个自己的出来作为补充. 2)jpa和hibern ...

随机推荐

  1. iTOP-4412开发板网盘资料介绍

    iTOP-4412开发板网盘视频资料内容如下: 01-烧写.编译以及基础知识视频 02-嵌入式Linux 视频 03-iTOP-4412 开发板硬件设计指导视频 04-Android 应用程序视频 0 ...

  2. fedora配置ip

    fedora20配置静态ip 原创 2015年08月08日 14:36:01 标签: fedora / linux / 网络配置 / ip配置 / 网络设置 2403 在linux的世界里,给主机设置 ...

  3. jQuery 点击 星星评分

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. 如何优雅地从CSDN转载文章

    复制粘贴应该是最显而易见的方法,但是不仅会有丢失内容,而且格式也会丢失.要想达到更好的效果,可以从html源码入手. 1.在chrome浏览器中打开要转载的文章,右键选择检查 2.在chrome的右方 ...

  5. webdrive脚本打开firefox浏览器,报“AttributeError: module 'selenium.webdriver' has no attribu

    按照网上提供的方法: 下载geckodriver之后解压缩到 Firefox安装目录 下 添加 Firefox安装目录 到 系统变量Path 重启pycharm 照此步骤执行后,仍然报同样的错.折腾了 ...

  6. 精准判断是360、IE和其他浏览器

    function myexplorer(){ var explorer = window.navigator.userAgent; if (!!window.ActiveXObject || &quo ...

  7. mxnet.base.MXNetError: src/imperative/./imperative_utils.h:70: Check failed: inputs[i]->ctx().dev_mask() == ctx.dev_mask() (1 vs. 2)

    mxnet 训练错误: mxnet.base.MXNetError: [14:42:22] src/imperative/./imperative_utils.h:70: Check failed: ...

  8. Linux从入门到适应(四):Ubuntu 16.04环境下,安装Nvidia驱动,cuda9.2和 cudnn

    在安装深度学习框架之前,cuda和cudnn是必须要提前安装的,现在按照流程而nvidia驱动的版本和cuda版本有这一些对应关系,所以需要按照版本进行安装,现在说一下如何安装: 1 安装nvidia ...

  9. BZOJ 2055 80人环游世界 有上下界最小费用可行流

    题意: 现在有这么一个m人的团伙,也想来一次环游世界. 他们打算兵分多路,游遍每一个国家.    因为他们主要分布在东方,所以他们只朝西方进军.设从东方到西方的每一个国家的编号依次为1...N.假若第 ...

  10. HDU4415 Assassin’s Creed

    题目大意:有n个人,每个人有x,y两个值.x代表干掉他得到的分数,分数和不超过m;y代表干掉他后你能额外干掉多少个,且不计入总分. 求干掉人数最多为多少,以及最小的分. ~~~~~~~~~~~~~~~ ...