sql - 以下 SQL 查询的等效条件查询?

标签 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. 将两行或多行的值收集到单行的列中的最正确的 SQL 方法是将表与其自身连接(一次或多次)。它比使用子查询更简单、更方便。
    因此,如果您可以在 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 中的另一个未解决问题。

关于sql - 以下 SQL 查询的等效条件查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18560161/

相关文章:

sql - 如何执行从 Azure 云数据库到本地服务器数据库的跨服务器查询

sql - 子选择查询中的表别名范围

java - Hibernate 标准投影

grails - 与关联和分页一起使用Grails条件的问题

java - 在 Hibernate 5 中,CriteriaQuery 等同于 Criteria 的限制和投影是什么?

sql - 如何在 Presto/Hive 中将日期格式 YYYY-MM-DD 转换为整数 YYYYMMDD?

sql - 将涉及多个表的左外连接从 Informix 重写为 Oracle

SQL GROUP BY 一年中每周的总价

database - 如何排除 hibernate 中返回的某些列

java - 如何将谓词列表添加到 CriteriaBuilder.or