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