现有三张表
TLXPURCHASE.采购事项审批表,TLXPURCHASEACTIVITY.采购招标活动对应表,TLXACTIVITY.招标活动表,采购事项审批表和采购活动表
是多对多关系。java中定义了两个实体类,ActivityPO和PurchasesPO,在ActivityPO类中定义了
private
Set<PurchasesPO> purchases;// 采购事项
字段。映射文件中配置了:
<!-- 采购事项 -->
<set name="purchases"
table="TLXPURCHASEACTIVITY" order-by="ACTIVITYID
asc">
<key column="ACTIVITYID"
/>
<many-to-many
class="com.wisdom.lxgz.purchases.model.po.PurchasesPO"
outer-join="auto"
column="PURCHASEID"
/>
</set>
现要查询采购事项审批信息,条件是该采购事项审批信息未分配采购活动即未出现在采购招标活动对应表(TLXPURCHASEACTIVITY)中或分配了
采购活动且该采购活动的status为4.
HQL语句:
StringBuffer hql = new StringBuffer();
hql.append(" select
new
com.wisdom.lxgz.purchases.model.vo.PurchasesVO(");
hql.append("
po.id , sys.name, po.name, po.procurement, po.createDept,
po.userName)");
hql.append(" from PurchasesPO po ,
SystemParamPO sys");
hql.append(" where
po.status=‘4‘");
hql.append(" and
sys.id=CAST(po.type as bigint)");
hql.append(" and po.id not in (select pur.id from ActivityPO activity join
activity.purchases pur where activity.status in
(‘0‘,‘1‘,‘2‘))");
hql.append(" order by
po.createDate desc");
hibernate执行上面的hql(其中的 hql.append(" and po.id not in (select pur.id from
ActivityPO activity join activity.purchases pur where activity.status in
(‘0‘,‘1‘,‘2‘))");)生成如下sql(部分):
.......
and (purchasesp0_.id not in(select purchasesp6_.id from TLXACTIVITY
activitypo4_, TLXPURCHASEACTIVITY purchases5_, TLXPURCHASE purchasesp6_ where
activitypo4_.ID=purchases5_.ACTIVITYID and
purchases5_.PURCHASEID=purchasesp6_.id and ((activitypo4_.STATUS in(‘0‘ , ‘1‘ ,
‘2‘))))).......
多对多关系中还有另外一种写法如下:
SELECT po.* FROM
PurchasesPO po,ActivityPO activity where po.id in
elements(activity.purchases)
相关文章
- 10-25mybatis 多对一查询的两种实现方式
- 10-25mybatis中多对一查询
- 10-25三层架构的一点理解以及Dapper一对多查询
- 10-25hibernate- Hibernate中多对多的annotation的写法(中间表可以有多个字段)
- 10-25(八)Django学习——常用的查询数据的方法以及查询条件;常用的字段类型映射关系,字段类型及Field的常用参数;Django的表关系的实现(一对多,一对一,多对多))
- 10-25(九)Django学习——一对一,一对多,多对多关系表的各种数据操作;跨关联关系的多表查询!
- 10-25EF更新多对多关系表中记录的时候,无法更新关系表的问题。
- 10-25Hibernate:JPA的一对多操作
- 10-25mybatis-一对多查询的模型
- 10-25一对多查询的万金油公式