2
Select "answer" 
  from 'Details' 
 where "question" like 'child'
   AND "subject" IN (select "subject"
                   from 'Details' 
                   where "question" like 'child'
                     AND "answer" = "M" and "test" ="1");

テーブル構造は次のとおりです。

Subject Test    Survey  Question              answer
----------------------------------------------------
rahul   1       one     childimmunization     Yes
rahul   1       one     childgender           M
Jyothi  1       one     childimmunization     No
Jyothi  1       one     childgender           F
Chikku  1       one     childimmunization     No
Chikku  1       one     childgender           M
4

1 に答える 1

2
  1. 2 つまたは複数の行から単一行の列に値を収集する最も適切な SQL 方法は、テーブルをそれ自体と結合することです(1 回以上)。サブクエリを使用するよりも簡単で便利です。 したがって、 Hibernate でからへの
    循環関連付けを作成できれば、それが最も簡単な解決策になります。しかし、Hibernate には結合で同じエンティティを 2 回使用する既知の問題 (およびオープン タスク) があるため、これは不可能だと思います。詳細はherehereです。DeatilsDetails

  2. しかし、この回答によると、HibernateDetachedCriteriaをサブクエリとして使用して、元の SQL に非常によく似たものを作成することができます。

テストされていないこのコードを提案しようとします:

DetachedCriteria subjectsWithBoys = DetachedCriteria.forClass(Details.class)
  .setProjection(Property.forName("subject"))
  .add(Restrictions.eq("question", "childgender"))
  .add(Restrictions.eq("answer", "M"))
  .add(Restrictions.eq("test", "1"));

Criteria criteria = getSession().createCriteria(Details.class)
  .setProjection(Property.forName("answer"))
  .add(Property.forName("subject").in(subjectsWithBoys))
  .add(Restrictions.eq("question", "childimmunization"))
  .add(Restrictions.eq("test", "1"));

これを簡単に利用して、Hibernate でこのような些細な作業で未解決の問題が発生しないことを願っています。

于 2013-09-01T20:50:20.420 に答える