【问题标题】:Hibernate HQL query with condition on second table在第二个表上使用条件的休眠 HQL 查询
【发布时间】:2015-03-13 07:42:43
【问题描述】:

我有两张表(关于足球):联赛和球队是一对多的关系。现在我想获得所有联赛,但仅限于那些名字开头的球队,例如与“S”。

到目前为止,我有这个:

Query query = session.createQuery("select l from League l left join l.teams as t with t.name like :name order by l.id");
query.setParameter("name", "S%");
List<League> list = query.list();

此查询返回所有联赛,也包括所有球队。看起来条件被忽略了。

我想要的只是获得所有联赛以及属于特定联赛的那些球队(由某些条件指定)。所以有可能获得没有团队的联赛。

League 类中的映射是

@OneToMany(mappedBy = "league", fetch = FetchType.EAGER)
private List<Team> teams;

在 Team 类中:

@ManyToOne
@JoinColumn(name = "LEAGUE_FK")
private League league;

我正在使用 Oracle 数据库。 查询有什么问题?

提前致谢。

【问题讨论】:

    标签: oracle hibernate hql conditional-statements one-to-many


    【解决方案1】:

    league.getTeams()的合同是返还联赛球队。无论您以何种方式找到联盟,该方法将始终返回该值。

    您的查询返回至少有一支球队以 S 开头的所有联赛。

    您需要的查询类似于

    select l, t from League l left join l.teams t on t.name like :name order by l.id
    

    这应该会得到一个List&lt;Object[]&gt;,其中每个数组的第一个元素是联赛,第二个元素是 null 或以 S 开头的球队。

    【讨论】:

    • 按照你的描述工作,但我还是不明白,为什么不能通过某些条件直接选择团队。所以这是过滤团队的唯一方法?
    • 联赛和球队之间的关联用于模拟联赛 A 有球队 1、2 和 3 的事实。联赛的一个实例代表数据库中的一个联赛。它的球队集合代表数据库中联赛球队的集合。它并不代表先前查询发生的选择。
    【解决方案2】:

    试试这个查询:

    Query query = session.createQuery("select l from League l where l in (select l from Team t where t.name like :name) order by l.id");
    query.setParameter("name", "S%");
    

    【讨论】:

    • 查询有什么问题?它返回的正是想要的答案:“我想要的只是获得所有联赛以及属于特定联赛的那些球队(由某些条件指定)。”轻微修改后查询将返回第二个问题的响应:“因此有可能获得没有团队的联赛”。
    • 1. select l from Team t where t.name like :name 没有意义。 2.where l in 不起作用。一旦你使那个查询有效,它就会比 OP 慢,并且有完全相同的问题:它仍然返回联赛,并且调用 League.getTeams() 仍然会返回联赛的所有球队。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-23
    • 2012-08-26
    • 1970-01-01
    • 1970-01-01
    • 2011-01-04
    相关资源
    最近更新 更多