2013-09-01 34 views
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"); 

表Struture是:以下SQL查询的等效条件查询?

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 
+0

这不会总是导致'答案= M'? –

+0

不,在“答案”中,我想为男性(“M”)和女性(“F”)分别获得YES或NO。但现在我只需要男性,所以在子查询中我已经做出了答案=“M”。 – user2541372

+0

您在外部查询中再次选择答案。 –

回答

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

  2. 但根据this answer你仍然可以尝试使用Hibernate DetachedCriteria作为子查询来使东西非常像你的原始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中另一个未决问题,这样一个简单的任务。

+0

我不需要SQL查询,我需要等价条件查询为我的SQL查询。请注意,我的SQL查询工作正常,没有两个表,只有一个表。在同一张桌子上我写​​了内部和外部查询。感谢您的答复 。希望你能得到正确的答案我的问题 – user2541372

+1

哦,我怎么会错过'hibernate-criteria'标签:)我已经完全重写了我的答案。顺便说一下,我认为,您的原始SQL查询存在问题,并且可能“正常工作”,只是因为缺少测试。 –

+0

感谢您的回复。我的问题得到解决。 – user2541372