iteye_7482 2012-07-26 17:35
浏览 184

HQL 多表查询

我有创建了一个字典的DB,里面有3张表:TB_EN_WORD,TB_EN_WORD_ATTR,TB_EN_WORD_EXMP,3张表都被设计为复合主键
表结构如下(“主”字代表主键):
TB_EN_WORD:
[table]
DICT_ID(主)
WORD_ID(主)
WORD
[/table]
TB_EN_WORD_ATTR:
[table]
DICT_ID(主)
WORD_ID(主)
PART_OF_SPEECH(主)
MEANING_NUM(主)
EXTD_ATTR
MEAN
[/table]
TB_EN_WORD_EXMP:
[table]
DICT_ID(主)
WORD_ID(主)
PART_OF_SPEECH(主)
MEANING_NUM(主)
EXAMPLE_NUM(主)
EXAMPLE_EXTD_ATTR
EN_EXMP
EXMP_MEANING
[/table]
3表之间的关联关系应该很明显的,现在我要实现一个功能:输入一个英语单词,查询出3张表中所有和这个单词相关的内容。为此,我设计了下面这样一条SQL:
[code="sql"]
select
word.word
, attr.extd_attr
, attr.mean
, exmp.dict_id
, exmp.word_id
, exmp.part_of_speech
, exmp.meaning_num
, exmp.example_num
, exmp.example_extd_attr
, exmp.en_exmp
, exmp.exmp_meaning
from
tb_en_word_exmp exmp
left join tb_en_word_attr attr
on exmp.dict_id = attr.dict_id
and exmp.word_id = attr.word_id
and exmp.part_of_speech = attr.part_of_speech
and exmp.meaning_num = attr.meaning_num
left join tb_en_word word
on attr.dict_id = word.dict_id
and attr.word_id = word.word_id
where
word.word = 'test'
[/code]
我用的ssh框架,这里需要用HQL来实现上面这句SQL,既然是多表查询,势必要修改hibernate的映射文件和table的实体类来实现表之间的关联关系,问题就在于我该如何表示它们之间的关联关系,我的疑点在于如何理解上面SQL里的left join?
理解1:tb_en_word_exmp左连接tb_en_word_attr,然后tb_en_word_attr左连接tb_en_word,这样一来,我想我应该修改tb_en_word_exmp的映射文件和实体类来实现tb_en_word_exmp到tb_en_word_attr的链接,然后同时修改tb_en_word_attr的映射文件和实体类来实现tb_en_word_attr到tb_en_word的链接;
理解2:tb_en_word_exmp左连接tb_en_word_attr,同时又左连接tb_en_word,这样一来,应该只要修改tb_en_word_exmp的映射文件和实体类来实现tb_en_word_exmp到tb_en_word_attr和tb_en_word的链接。
那么,到底哪种理解才是正确的呢,还是说两种方法都不对?请熟悉HQL的人教我一下,我是第一次用HQL的多表查询

  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥15 matlab图像高斯低通滤波
    • ¥15 针对曲面部件的制孔路径规划,大家有什么思路吗
    • ¥15 钢筋实图交点识别,机器视觉代码
    • ¥15 如何在Linux系统中,但是在window系统上idea里面可以正常运行?(相关搜索:jar包)
    • ¥50 400g qsfp 光模块iphy方案
    • ¥15 两块ADC0804用proteus仿真时,出现异常
    • ¥15 关于风控系统,如何去选择
    • ¥15 这款软件是什么?需要能满足我的需求
    • ¥15 SpringSecurityOauth2登陆前后request不一致
    • ¥15 禅道二次开发编辑版本,上传不了发行包