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/天,具体规则查看活动详情