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 请教一下各位,为什么我这个没有实现模拟点击
    • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
    • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
    • ¥20 有关区间dp的问题求解
    • ¥15 多电路系统共用电源的串扰问题
    • ¥15 slam rangenet++配置
    • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
    • ¥15 ubuntu子系统密码忘记
    • ¥15 保护模式-系统加载-段寄存器
    • ¥15 电脑桌面设定一个区域禁止鼠标操作