join_type
指出连接类型,可分为三种:内连接、外连接和交叉连接。
其中
join_table
指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一个表操作的连接又称做自连接。
内连接
(INNER JOIN)
使用比较运算符进行表间某
(
些
)
列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。
外连接分为左外连接
(LEFT OUTER JOIN
或
LEFT JOIN)
、右外连接
(RIGHT OUTER JOIN
或
RIGHT JOIN)
和全外连接
(FULL OUTER JOIN
或
FULL JOIN)
三种。
与内连接不同的是,外连接不只列出与连接条件相匹配的行,而是列出左表
(
左外连接时
)
、右表
(
右外连接时
)
或两个表
(
全外连接时
)
中所有符合搜索条件的数据行。
交叉连接
(CROSS JOIN)
没有
WHERE
子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。
连接操作中的
ON (join_condition)
子句指出连接条件,它由被连接表中的列和比较运算符、逻辑运算符等构成。
无论哪种连接都不能对
text
、
ntext
和
image
数据类型列进行直接连接,但可以对这三种列进行间接连接。例如:
SELECT p1.pub_id,p2.pub_id,p1.pr_info
FROM pub_info AS p1 INNER JOIN pub_info AS p2
ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info)
(
一
)
内连接
内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。内连接分三种:
1
、等值连接:
在连接条件中使用等于号
(=)
运算符比较被连接列的列值,其查询结果中列出被连接表中的所有列,包括其中的重复列。
2
、不等连接:
在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。这些运算符包括
>
、
>=
、
<=
、
<
、
!>
、
!<
和
<>
。
3
、自然连接:
在连接条件中使用等于
(=)
运算符比较被连接列的列值,但它使用选择列表指出查询结果集合中所包括的列,并删除连接表中的重复列。
例,下面使用等值连接列出
authors
和
publishers
表中位于同一城市的作者和出版社:
SELECT *
FROM authors AS a INNER JOIN publishers AS p
ON a.city=p.city
又如使用自然连接,在选择列表中删除
authors
和
publishers
表中重复列
(city
和
state)
:
SELECT a.*,p.pub_id,p.pub_name,p.country
FROM authors AS a INNER JOIN publishers AS p
ON a.city=p.city
(
二
)
外连接
内连接时,返回查询结果集合中的仅是符合查询条件
( WHERE
搜索条件或
HAVING
条件
)
和连接条件的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表
(
左外连接时
)
、右表
(
右外连接时
)
或两个边接表
(
全外连接
)
中的所有数据行。
如下面使用左外连接将论坛内容和作者信息连接起来:
SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b
ON a.username=b.username
下面使用全外连接将
city
表中的所有作者以及
user
表中的所有作者,以及他们所在的城市:
SELECT a.*,b.*
FROM city as a FULL OUTER JOIN user as b
ON a.username=b.username
(
三
)
交叉连接
交叉连接不带
WHERE
子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。
例,
titles
表中有
6
类图书,而
publishers
表中有
8
家出版社,则下列交叉连接检索到的记录数将等
于
6*8=48
行。
SELECT type,pub_name
FROM titles CROSS JOIN publishers
ORDER BY type
二、
Hibernate
建立表结构
在前面基础知识得基础上我们来建立供我们演示得两张表(我们用
mysql
数据库作为学习用):
People
:
create table people(id bigint not null auto_increment,
name varchar(20),
primary key(id));
location
:
create table location(id bigint not null auto_increment,
peopleId bigint not null,
addr varchar(20),
primary key(id,peopleId));
hibernate
影射文件:
hibernate.cfg.xml
文件:
<session-factory>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/relation</property>
<property name="connection.username">root</property>
<property name="connection.password">mysql</property>
<property name="show_sql">true</property>
<mapping resource="org/test/bean/People.hbm.xml"/>
<mapping resource="org/test/bean/Location.hbm.xml"/>
</session-factory>
People.hbm.xml
文件:
<class name="People" table="people">
<id name="id" column="id">
<generator class="native"/>
</id>
<property name="userName" type="string" column="name"/>
<set name="locations" cascade="delete" inverse="true" lazy="false">
<key column="peopleId"/>
<one-to-many class="Location"/>
</set>
</class>
Location.hbm.xml
文件
:
<class name="Location" table="location">
<id name="id" column="id">
<generator class="native"/>
</id>
<property name="addr" type="string" column="addr"/>
<many-to-one name="people" column="peopleId" class="People" not-null="true"/>
</class>
上面列出的都非常简单,不再解释。
Java
类源代码不再列出,很简单。
三、
Hibernate
连接查询
我们假设一种场景需要查询所有叫
Jack
或者地址为
BJ China
的人的信息。
经分析我们要用内连接查出两个表中
people.id
==
location.peopleId
并且在
people
表中
name
为
Jack
或者在
location
表中
addr
为
shanghai
的人。
用习惯了
jdbc
的朋友也许一下就想到了如下语句:
select p.*
from people p inner join location l
on (p.name='Jack'or l.addr='BJ China')
and
p.id=l.peopleId
其实,在
hibernate
的
api
中提供了对标准
sql
的支持,我们可以用
sql
语句来获得查询结果。
Hibernate
中还有另外两种种查询方法那就是
Query
和
Criteria
,通过这两种方法我们可以轻松的写我们的
sql
语句,而不用关心到底用哪种连接。
下面我们就看一下如何分别用以上三种方法实现对我们要求的数据的读取:
首先,我们看一下用标准
sql
的做法:
session
.createSQLQuery(
"select p.* from people p inner join location l on (p.name='Jack' or l.addr='BJ China') and p.id=l.peopleId"
)
执行这句话我们就可以读取到我们需求的数据,但是根据
api
我们知道,
SQLQuery
返回的是一个实现了
SQLQuery
接口的对象,对我们来说没有直接的操作性。
如果我们直接用:
session
.createSQLQuery(
"select p.* from people p inner join location l on (p.name='Jack' or l.addr='BJ China') and p.id=l.peopleId "
).list();
来得到
list
,并对
list
里的对象进行转化为
People
对象时,我们会看到这样的抱错信息:
Exception in thread "main"
java.lang.ClassCastException
: [Ljava.lang.Object;
我们无法对数据进行操作,从
api
知道
SQLQuery
继承自
Query
接口,那么我们可不可以用
Query
的标准方法操作返回数据呢?我们可以对程序作如下改造即可得到我们需要的可以后续操作的数据:
Query query =
session
.createSQLQuery(
"select p.* from people p inner join location l on p.name='Jack' and p.id=l.peopleId or l.addr='BJ China'"
).addEntity(People.
class
);
这样结果可以和我们就可以对结果进行操作了,不再多说。
接下来我们看一下我们怎么用
Hibernate
特色的
sql
语言来获取数据:
Query query =
session
.createQuery(
"select p from People p,Location l where (p.userName='Jack' or l.addr='BJ China') and p.id=l.people.id"
);
有没有觉得太大的不同呢?我们不再需要“
inner join
”,而是直接从两个类里边读取符合条件的对象。
最后我们看一下
Hibernate
如何用
Criteria
进行连接查询:
Criteria
criteria =
session
.createCriteria(People.
class
)
.createAlias(
"locations"
,
"location"
)
.add(Restrictions.or
(Restrictions.eq
(
"userName"
,
"Jack"
), Restrictions.eq
(
"location.addr"
,
"BJ China"
)));
分享到:
相关推荐
SQL连接器是数据库管理系统与应用程序之间的重要桥梁,它允许程序通过特定的接口与各种数据库进行交互,从而实现数据的查询、插入、更新和删除等操作。在本文中,我们将深入探讨SQL连接器的工作原理、常见类型以及...
而"简单的SQL连接客户端"则是一个专为用户设计的轻量级应用,旨在帮助用户方便地连接到SQL Server数据库进行相关操作。下面将详细介绍SQL连接客户端的相关知识点。 首先,SQL连接客户端是数据库管理员、开发人员和...
MCGS通网版与SQL连接 MCGS通网版与SQL连接是指在通网版MCGS中保存的数据如何保存到SQL数据库中,以便更好地管理和分析数据。在这个过程中,需要在不同的组态软件中进行连接设置。下面将详细介绍如何在通网版MCGS...
云风SQL连接器是一款小巧而强大的工具,专为开发者设计,便于快速、高效地与SQL服务器建立连接。这款连接器以其简洁的界面和强大的功能,为数据库管理提供了极大的便利。在本文中,我们将深入探讨这款连接器的核心...
### Intouch与SQL连接方法详解 #### 一、引言 在北京汉锦电子自动化系统有限公司的文档中,王明明详细介绍了Intouch与SQL Server数据库之间的连接方法。这是一篇非常实用的技术指南,对于那些需要在Intouch环境中...
**SQL连接测试器**是一种实用工具,主要用于验证和测试数据库的连接性,确保应用程序能够成功地与SQL服务器建立通信。这个工具通常是开发人员和DBA(数据库管理员)在软件项目实施过程中不可或缺的一部分,因为它...
超好用的SQL连接工具,操作比查询分析器方便很多
本文将详细讨论SQL连接、连接管理以及为何需要“SQL连接清除工具”。 SQL连接指的是一个客户端应用程序与数据库服务器之间的通信会话。当用户执行查询、更新或事务时,都会建立这样的连接。在多用户环境下,大量...
比较不错的SQL连接器比较不错的SQL连接器比较不错的SQL连接器比较不错的SQL连接器比较不错的SQL连接器比较不错的SQL连接器
1433连接器,黑血专用(SQL连接) 1433连接器,黑血专用(SQL连接) 1433连接器,黑血专用(SQL连接) 1433连接器,黑血专用(SQL连接) 1433连接器,黑血专用(SQL连接) 1433连接器,黑血专用(SQL连接) 1433连接器,黑血专用(SQL...
标题中的“SQL连接器”指的是一个用于连接到SQL数据库的工具,它允许用户与各种SQL数据库进行交互,例如MySQL、PostgreSQL、SQL Server等。这样的工具通常具备查询编写、数据浏览、数据库管理以及数据导入导出等功能...
一直在用的这个工具和大家分享一下,简单易的数据库连接测试工具,主要用来测试是否能连接数据库,不过也可以编码数据库和执行SQL代码,工具虽说,但功能强大。 已测试过 sql server 2000,sql2005,sql2008,mysql, ...
SQLTools sql连接工具SQLTools sql连接工具SQLTools sql连接工具
SQL连接远程数据库的详细方法 SQL连接远程数据库是数据库管理和开发中一个非常重要的步骤。今天,我们将讨论两种SQL连接远程数据库的详细方法,一是SQL2000的、一是SQL2005。这些方法都是基于TCP/IP协议的,需要在...
风云SQL连接器是一款高效、稳定的数据库连接工具,它允许用户通过SQL语句与各种数据库管理系统进行交互。在IT行业中,SQL连接器是数据操作和分析的关键组成部分,它为开发者提供了与数据库进行通信的桥梁。本篇文章...
标题“sqljdbc_1.2 SQL连接java”指的是使用微软提供的SQL JDBC驱动程序版本1.2来连接Java应用程序与SQL Server数据库。SQL JDBC是Java语言中的一个库,它允许Java开发者通过JDBC(Java Database Connectivity)接口...
在Java编程中,SQL连接是不可或缺的部分,它使得应用程序能够与数据库进行交互,执行查询、更新等操作。本文将深入探讨“sql连接常用jar包”这一主题,介绍如何在Java项目中配置和使用这些jar包,以及它们在SQL连接...
"连接使用说明.docx"文档很可能是提供了关于如何配置和使用HeidiSQL连接数据库的详细步骤,包括如何设置服务器信息、选择正确的数据库类型、输入认证凭据等。阅读这份文档将有助于初学者快速上手。 **HeidiSQL_11.0...
"Delphi线程检测SQL连接不卡界面"的主题着重于如何在后台执行耗时操作(如检查SQL数据库连接)而不阻塞用户的交互体验。Delphi是Object Pascal语言的集成开发环境,它提供了一种强大的多线程能力来解决此类问题。 ...
下面将详细介绍SQL连接字符串的配置及其重要性。 **SQL连接字符串的构成** 一个SQL连接字符串通常包括以下几个部分: 1. **服务器名称/地址**: 这是指SQL Server实例所在的物理或虚拟主机的IP地址或主机名。可以...