以下SQL查询的等效标准查询?

时间:2013-09-01 15:53:18

标签: sql hibernate-criteria

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

1 个答案:

答案 0 :(得分:2)

  1. 将两行或多行的值收集到单行列中的最合适的SQL方法是自己连接表(一次或多次)。它比使用子查询更简单,更方便。
    因此,如果你可以在Hibernate中创建从DeatilsDetails的循环关联 - 这将是最简单的解决方案。但我想这是不可能的,因为Hibernate已经知道问题(和开放任务)在连接中使用相同的实体两次 - 细节是herehere

  2. 但是根据this answer,您仍然可以尝试使用Hibernate DetachedCriteria作为子查询来制作与原始SQL非常相似的内容。

  3. 我会尝试建议这段代码,但未经过测试:

    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中遇到这样一个简单的任务中的另一个开放问题。