Hibernate中如何用纯HQL关联两个实体类获取所有匹配记录
嘿,我来帮你搞定这个HQL的问题~首先咱们先看看你之前写的查询哪里出问题了:你写的FT.termId=FD.feeTerms是类型不匹配的,FD.feeTerms是一个FeeTerms实体对象,而FT.termId是整数主键,这俩没法直接比较,这就是你没得到预期结果的原因。
下面给你几个正确的纯HQL实现方案,根据你的需求选就行:
因为FeeTerms和FeeTermDates是一对多的关联关系(一个FeeTerms对应多个FeeTermDates),用HQL的JOIN语法来关联查询是最规范的方式:
如果你想获取每个匹配的FeeTerms和对应的FeeTermDates完整实体,可以这么写:
SELECT FT, FD FROM FeeTerms FT JOIN FT.feeTermDateses FD
执行这个查询后,返回的是List<Object[]>,每个数组的第一个元素是FeeTerms对象,第二个是对应的FeeTermDates对象,你可以遍历这个列表来获取数据。
如果你只需要特定字段(比如你之前提到的termId、termName等),可以调整查询字段:
SELECT FT.termId, FT.termName, FT.termCount, FD.tdmId, FD.date FROM FeeTerms FT JOIN FT.feeTermDateses FD
这样返回的结果是包含指定字段的对象数组,按需提取即可。
如果你想沿用你之前的写法,只需要把关联条件改对,把FD.feeTerms换成FD.feeTerms.termId(取实体的主键来匹配):
SELECT FT.termId, FT.termName, FT.termCount, FD.date FROM FeeTerms FT, FeeTermDates FD WHERE FT.termId = FD.feeTerms.termId
不过这种写法是基于笛卡尔积的关联,语义上不如JOIN清晰,一般更推荐方案1。
FeeTerms对象 看你的FeeTerms实体代码,feeTermDateses字段用的是FetchType.EAGER(立即加载),所以如果你只需要获取所有FeeTerms,同时自动加载它们对应的所有FeeTermDates记录,其实不需要写复杂的关联查询,直接查询FeeTerms就行:
FROM FeeTerms FT
返回的List<FeeTerms>里,每个FeeTerms对象调用getFeeTermDateses()就能拿到对应的所有FeeTermDates集合了,Hibernate会帮你自动完成关联加载。
如果需要过滤特定条件的记录,比如只查某个学期名称的记录,可以在WHERE子句里加条件,比如:
SELECT FT, FD FROM FeeTerms FT JOIN FT.feeTermDateses FD WHERE FT.termName = '第一学期'
内容的提问来源于stack exchange,提问作者bharath

