DetachedCriteria如何使用左连接查询 以及 左链接 右链接 内链接的简单介绍和使用

DetachedCriteria如何使用左连接查询  以及DetachedCriteria.LEFT_JOIN失效的解决方法

由于前期表设计,在我的商品订单表种没有商品名和商品单价字段

现在我获取一个订单需要同时显示商品名和商品单价

这里我可以去修改表来达到目的,也可以通过hql的连接查询来处理

但是由于我使用了DetachedCriteria的分页技术

所以就只有考虑使用DetachedCriteria来处理这个左联接查询了


那么什么是左联接查询呢

LEFT OUTER JOIN  所写就是  LEFT JOIN

比如A表和B表

A表字段以及数据如下

id    name

1    liki

2    lone

3    java

B表字段以及数据如下

id    age

1    21

2    23

3    24

4    25

那么如果是左链接: A left join B 结果就是id为1 2 3 的姓名和年龄

相反如果是右链接:A right join B结果就是 1 2 3 4的姓名和年龄,其中id为4的人,他的姓名是空

以上关于左联接,右链接的一些简单介绍,不是本例的重点哈


我这里需要用DetachedCriteria左链接查询

那么我们可以这样做

首先在左的一方,就是 A left join B 的A方

添加如下代码,即在其实体中添加如下代码

private ShopInformation shopinfo;
@ManyToOne()
@JoinColumn(name="shopid",unique=false,nullable=true)
public ShopInformation getShopinfo() {
return shopinfo;
}
public void setShopinfo(ShopInformation shopinfo) {
this.shopinfo = shopinfo;
}
上面的代码意思是说,我是多对一关系,我对应的实体是ShopInformation


然后我设置了一个外建 shopid,这个shopid就是ShopInformation的主健

就是说,保存A这个实体的时候,需要指定其外建的值,这样我们查询的时候就知道去查询哪一个ShopInformation了

然后在程序中我们这样写DetachedCriteria

criteria.createAlias("shopinfo","shopinformation",JoinType.parse(1))
这里第一个参数是我们在实体中指定的引用名,大家可以看上面的代码

第二个参数为我们引用的实体的别名

即 实体 ShopInformation 的顶部我们加了如下的注解

@Entity(name = "shopinformation")

第三个参数是非必须的


这里需要注意的是网上大都使用如下代码

DetachedCriteria.LEFT_JOIN
而该代码为过期代码

目前我们是使用的代码是JoinType.parse(1)

JoinType是一个枚举类型

他的源码如下:

import org.hibernate.HibernateException;

/**
 * @author Strong Liu
 */

public enum JoinType {
	NONE( -666 ),
	INNER_JOIN( 0 ),
	LEFT_OUTER_JOIN( 1 ),
	RIGHT_OUTER_JOIN( 2 ),
	FULL_JOIN( 4 );
	private int joinTypeValue;

	JoinType(int joinTypeValue) {
		this.joinTypeValue = joinTypeValue;
	}

	public int getJoinTypeValue() {
		return joinTypeValue;
	}

	public static JoinType parse(int joinType) {
		if ( joinType < 0 ) {
			return NONE;
		}
		switch ( joinType ) {
			case 0:
				return INNER_JOIN;
			case 1:
				return LEFT_OUTER_JOIN;
			case 2:
				return RIGHT_OUTER_JOIN;
			case 4:
				return FULL_JOIN;
			default:
				throw new HibernateException( "unknown join type: " + joinType );
		}
	}
}
所以我们这里选择 JoinType.parse(1)


此外,该参数是非必须的,如果不填写,默认是 INNR_JOIN 内链接


内链接,我也简单的介绍下吧

如上面的两个表 A  B  我们稍微改一下 

A表字段以及数据如下

id    name

1    liki

2    lone

3    java

8    daxiang

B表字段以及数据如下

id    age

1    21

3    23

4    24

5    25

如果查询语句是这样 select * from A inner join B on A.id = B.id


那么结果将是  id为1和3的数据,其他数据都不会显示

就是说INNER JOIN 他只查询满足条件的链接


最后我们接着上面

最终的查询代码如下

criteria.createAlias("shopinfo", "shopinformation",JoinType.parse(1)).add(Restrictions.eq("userid", userid));
List<Shoporder> list = (List<Shoporder>) hibernateTemplate.findByCriteria(criteria, start, Length);
上面的查询结果是一个list,里面保存的是 Shoporder对象  以及ShopInformation这个对象


ShopInformation对象可以通过get获取

自此,使用DetachedCriteria进行左连接查询的大概步骤就是这样





爆款云服务器s6 2核4G 低至0.46/天,具体规则查看活动详情Blog Img