我有创建了一个字典的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的多表查询

HQL 多表查询
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-