代码之家  ›  专栏  ›  技术社区  ›  Glenn

查询限制关联实体

  •  0
  • Glenn  · 技术社区  · 15 年前

    我想形成一个查询,其中关联的集合 限制,最好是休眠标准或HQL,但我会 对如何在SQL中执行此操作感兴趣。例如,假设我有一个男孩 类与kites类的双向一对多关联。 我想要一份风筝长度在一定范围内的男孩名单。

    问题是,我知道的HQL/标准只会让我得到男孩对象 有一套完整的(不受限制的)风筝,如这两个 示例(HQL是一个猜测)。也就是说,我找到那些有风筝的男孩 在正确的范围内,但对于每一个这样的男孩我 全部的 不是风筝 就在这个范围内。

    select new Boy(name) from Boy b 
           inner join Kite on Boy.id=Kite.boyId 
                 where b.name = "Huck" and length >= 1;
    
    Criteria crit = session.createCriteria(Boy.class);
    crit.add(Restrictions.eq("name", "Huck"))
        .createCriteria("kites")
        .add(Restrictions.ge("length", new BigDecimal(1.0)));
    List list = crit.list();
    

    现在唯一能得到正确风筝长度的方法是 遍历男孩列表,并为每个男孩重新查询风筝 对于范围内的那些。我希望有一些SQL/HQL/Criteria向导 知道更好的方法。我希望得到一个标准解决方案,因为 真正的“boy”构造器有很多参数,而且很方便 让初始化的男孩。

    我的底层数据库是mysql。别以为我知道很多 SQL或休眠。谢谢!

    2 回复  |  直到 11 年前
        1
  •  1
  •   Alex Martelli    15 年前

    我不是Hibernate专家,但正如您所说,您也对SQL解决方案感兴趣…:

    在SQL中,我假设您的意思是(添加索引、键等):

    CREATE TABLE Boys (Id INT, Name VARCHAR(16))
    CREATE TABLE Kites(Length FLOAT, BoyID INT, Description TEXT)
    

    当然还有其他不重要的专栏。

    所有男孩都有长度在1.0到1.5之间的风筝:

    SELECT DISTINCT Boys.*
    FROM Boys
    JOIN Kites ON(Kites.BoyID=Boys.ID AND Kites.Length BETWEEN 1.0 AND 1.5)
    

    如果您还想查看相关风筝的描述,每个男孩拥有N行这样的风筝:

    SELECT Boys.*, Kites.Length, Kites.Description
    FROM Boys
    JOIN Kites ON(Kites.BoyID=Boys.ID AND Kites.Length BETWEEN 1.0 AND 1.5)
    

    希望有人能帮你把这些和保健药结合起来…!

        2
  •  0
  •   Glenn    15 年前

    事实证明,这最好通过反转联接来完成:

    Criteria crit = session.createCriteria(Kite.class);
    crit.add(Restrictions.ge("length", new BigDecimal(1.0))
    .createCriteria("boy")
    .add(Restrictions.eq("name", "Huck")));
    List<Kite> list = crit.list();
    

    注意,列表中的风筝需要聚合成男孩,这是 使用哈希图可以很容易地完成。