【问题标题】:Hibernate NamedQuery with a condition on inner List具有内部列表条件的休眠 NamedQuery
【发布时间】:2012-09-14 11:46:32
【问题描述】:
    class A{
// one to many mapping
    List<B> listOfB;
    //getter and setter;
    class B {
    String s;
    //getter and setter
    }

现在,当我得到类 A 时,它将返回 listOfB 中所有关联的类 B。但我需要确定 B 中的哪一个应该做出回应。像 Get A 这样 listOfB 包含所有这样的 B s = 'something'。

编辑:目前这不起作用:

select a from A a where a.listOfB IN (select b from a.listOfB b where b.s='something');

【问题讨论】:

    标签: java sql hibernate named-query


    【解决方案1】:

    1) 我假设您映射了从 A 到 B 的一对多关系,例如 A.listOfB = B.b

    我认为您的查询可以简化为:

    select a 
    from A a, B b
    where a.listOfB = b.b
    and where b.s='something'
    

    等效的 Hibernate Criteria 查询将是:

    List results =  sess.createCriteria(A.class)  
        .createCriteria("listOfB")
        .add(Restrictions.eq("s", "something"))
        .list();
    

    2) 如果这些实体之间没有映射关系,您可以在字段 a.listOfB 上使用 SQLRestriction

    List results = sess.createCriteria(A.class)
    .add( Restrictions.sqlRestriction("{alias}.listOfB in (selec b from B where b.s = ?)), "something", Hibernate.STRING) )
       .list();
    

    更多示例here。

    【讨论】:

    • 您的 HQL 查询无效:b.b 不存在,无法将列表与实体进行比较。此外,这不会解决 OP 的问题:他仍然会获得每个 A 中 B 的完整列表,而不仅仅是满足标准的 B。
    【解决方案2】:

    你可以用 Hibernate 做到这一点,尽管 JPA 规范说它应该被禁止。事实上,当你得到一个A 时,它的 B 列表应该始终是完整的列表 a B。不是已被某些查询过滤的列表。我会避免这样做,因为它很危险。相反,我会使用如下查询:

    select a, b from A a inner join a.listOfB b where b.s = 'something'
    

    现在你已经拥有了所有你感兴趣的 As 和所有你感兴趣的 B:

    A1, B1
    A1, B2
    A2, B7
    A2, B8
    

    如果您真的想获得带有部分 B 列表的 As,请使用以下查询。但是你已经被警告了:它不便携,而且很危险:

    select a from A a inner join fetch a.listOfB b where b.s = 'something'
    

    【讨论】:

      猜你喜欢
      • 2016-10-04
      • 2012-06-27
      • 2011-10-12
      • 2014-02-04
      • 2018-01-10
      • 2017-12-25
      • 1970-01-01
      • 1970-01-01
      • 2016-05-05
      相关资源
      最近更新 更多