前几天在维护别人项目代码的时候遇到了一个需求的改动,一个报表查询功能,由原有的3张表(a,b,c)现在可能要查询4张表(a,b,c,d),原程序员的代码是用hql关联3个表,然后用等值连接进行查询,但是我在第四个表的时候实际情况需要用到left join,于是我没有做任何的改动,直接在原来的hql语句中写left join d表,结果我错了,hibernate根本就不认识,我又不想用sql把所有的字段都查询一遍,然后再set一遍,后来在hibernate中配置相关的一对一和一对多的代码,如下:
一对一配置(一的一端):a表:<one-to-one name="certOrderDetail" property-ref="corder"></one-to-one>
一对一配置(多的一端):b表:<many-to-one name="corder" column="CERT_ORDER_ID" unique="true" update="false" insert="false"></many-to-one>此处多的一方必须添加unique=true
一对多(一的一端):c表:<one-to-one name="certInfoDetail" property-ref="corderDetail"></one-to-one>
一对多(多的一端):d表:<set name="certInfoDetail" fetch="join">
<key column="CERT_ORDER_ID"></key>
<one-to-many class="com.sxca.certapply.entity.CertInfoDetail"></one-to-many>
</set>
需要注意的是:
1.a表中的CERT_ORDER_ID必须是主键,在b表中是外键,虽然在数据库设计上没有明确的设置外键,这里的配置在hibernate中相当于是设置了外键
2.一对多没什么可说的,只需注意这里如果用set的话,在实体里面也需要用set,这里用list的话,在实体里面也需要用list,否则会发生错误。
3.这里是我发现的一个误区,第二张表(b)和第三张表(c)关联的时候,我的实际情况是直接用两个的外键进行关联,结果坑爹的情况出现了,竟然是b表的主键和我c表的主键进行了关联,这里百思不得其解,经过措辞排查没有找到相应的问题,最后看到有人说外键与外键好像不能这么做,也没法做一对一,最后我彻底的放弃了,推翻了3天研究的这个坑所有的代码,半个小时用sql写了,希望能够帮助大家走出误区。