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 SERVER
sql 连接字符串
超好用的SQL连接工具,操作比查询分析器方便很多
比较不错的SQL连接器比较不错的SQL连接器比较不错的SQL连接器比较不错的SQL连接器比较不错的SQL连接器比较不错的SQL连接器
在java中配置sql连接池的步骤以及原文件,不足之处请大家指正
短小精悍的云风SQL连接器,用于连接SQL服务器!方便快捷!
1433连接器,黑血专用(SQL连接) 1433连接器,黑血专用(SQL连接) 1433连接器,黑血专用(SQL连接) 1433连接器,黑血专用(SQL连接) 1433连接器,黑血专用(SQL连接) 1433连接器,黑血专用(SQL连接) 1433连接器,黑血专用(SQL...
一直在用的这个工具和大家分享一下,简单易的数据库连接测试工具,主要用来测试是否能连接数据库,不过也可以编码数据库和执行SQL代码,工具虽说,但功能强大。 已测试过 sql server 2000,sql2005,sql2008,mysql, ...
SQLTools sql连接工具SQLTools sql连接工具SQLTools sql连接工具
sqljdbc4 (SQL连接驱动包)sqljdbc4 (SQL连接驱动包) sqljdbc4 (SQL连接驱动包) sqljdbc4 (SQL连接驱动包)
SQL连接测试器 本人收藏了3年的资源 现放出 都是总结了很多系统 软件项目实施过程中的经验的 慢慢积累的
SQLBrowser(一个很小的SQL连接工具),简便快捷
数据库原理及运用实验四SQL连接查询.doc
非常好用的sqltool 无毒 无后门,sql连接工具sql连接工具sql连接工具
sql连接myeclipse与sql的连接
SQL(Structured Query Language,结构查询语言)是一个功能强大的数据库语言。SQL通常使用于数据库的通讯。ANSI(美国国家标准学会)声称,SQL是关系数据库管理系统的标准语言。SQL语句通常用于完成一些数据库的操作...
VB连接SQL 连接数据库 ODBC 数据库
intouch与SQL连接方法
连接SQL数据库,不用写命令,方便实用!