hibernate DetachedCriteria 子查询对应sql的in语句

需要从两个关联进行数据查询。找了一下午,可算找到个能看懂的

原文链接:http://blog.sina.com.cn/s/blog_ba1bed340101lvx1.html



从数据库查询的sql语句如下:

select * from bdorder where Id in (select DISTINCT details from orderDetail  "
					+ "where detailStatus like ‘%3N‘) "
					+ "and status like ‘%3Y‘

项目中使用的是hibernate框架。

使用到criteria ,DetachedCriteria 单个表用的时候那是相当方便,第一次多表查询,就有点蒙了,

首先是单个表的查询

order实体

//对order表进行查询//初始化criteriaDetachedCriteria criteria = DetachedCriteria.forClass(BDOrder.class);

//给criteria添加条件,引号中status为实体中的字段,后一个为值criteria.add(Restrictions.like("status", states));

//添加多个条件。有多少加多少。......

//查找结果。List<BDOrder> orderList = this.getHibernateTemplate().findByCriteria(criteria);

  

两个表的查询,实现最开始的sql语句

BDOrder 实体和 BDOrderDetail 实体

DetachedCriteria criteria = DetachedCriteria.forClass(BDOrder.class);

//添加查询条件criteria.add()

//初始化BDOrderDeaila 的criterial
DetachedCriteria criteriaDetail = DetachedCriteria.forClass(BDOrderDetail.class);

//添加OrderDetail实体的查询条件
criteriaDetial.add(Restrictions.like("detailStatus", "%3N"))

//设置这个表的查询结果。注意details为实体映射文件中对应的字段,不是数据库中的列名criteriaDetail.setProjection(Property.forName("details "));

//设置去除查询结果中的重复数据criteriaDetail.setResultTransformer(criteriaDetail.DISTINCT_ROOT_ENTITY);

//关联两个实体的关系criteria.add(Property.forName("id").in(criteriaDetail));

//然后直接使用criteria去查询就可以了。//查找结果。List<BDOrder> orderList = this.getHibernateTemplate().findByCriteria(criteria);
//以上可以实现最开始的那句sql,

  顺便复习一下Restrictions的用法:


方法


说明


Restrictions.eq



Restrictions.allEq


利用Map来进行多个等于的限制


Restrictions.gt



Restrictions.ge


>=


Restrictions.lt



Restrictions.le


<=


Restrictions.between


BETWEEN


Restrictions.like


LIKE


Restrictions.in


in


Restrictions.and


and


Restrictions.or


or


Restrictions.sqlRestriction


用SQL限定查询

时间: 2024-11-05 20:31:27

hibernate DetachedCriteria 子查询对应sql的in语句的相关文章

优化有标量子查询的SQL

数据库环境:SQL SERVER 2008R2 今天在数据库中抓出一条比较耗费资源的SQL,只返回904条数据,居然跑了40多分钟.SQL及对应的数据量如下图: SELECT saft04.cur_year , LEFT(saft04.dept_id, 4) sdept_id , saft04.vdept_id , saft04.dept_id , saft04.fee_id , saft04.vitem_id , ISNULL(saft04.fee_amt, 0) AS saft04_fee_

013.子查询和分页子查询(sql实例)

--1 子查询 如果子查询和表连接都实现的时候,推荐用表连接实现( 一般:能用表连接实现的就用表连接,有些情况用表连接不能 或者不易实现的再选择子查询) 系统:缓存,执行计划技术手段 --1 where 条件后 + 子查询 注意: 1 先执行的是子查询语句 2 子查询嵌套的层数越大,性能会随之递减 A) 当子查询写在比较运算符之后(=,!=,>,...)时 要求:子查询的查询结果不能多于1个(1,0(不会报错, 没有结果)) --eg select * from EMP where SAL>(

Hibernate的批量查询——原生sql查询

1.查询所有的学生信息: (1)查询结果中,一条信息放入到一个数组中,从list集合中取出数组,并对数组进行遍历. public class GeneratorTest { public static void testSel() { Session session = HibernateUtils.openSession(); Transaction transaction = session.beginTransaction(); String sql="Select * from Stud

Hibernate oracle子查询

实体类 图书编号,名称,出版社,价格 查询图书的价格大于图书的平均价格的图书信息 多表联查 原文地址:https://www.cnblogs.com/ztca/p/8194240.html

Hibernate中使用子查询

子查询: 子查询是SQL语句中非常重要的功能特性,它可以在SQL语句中利用另外一条SQL语句的查询结果,在Hibernate中HQL查询同样对子查询功能提供了支持. 如下面代码所示: List list=session.createQuery("from Customer c where 1>(select count(o) from c.orders o)").list(); 上面的程序查询订单数超过1的所有客户,因此和上面子查询HQL语句对应的SQL语句为: Select *

Hibernate HQL中的子查询

子查询是SQL语句中非常重要的功能特性,它可以在SQL语句中利用另外一条SQL语句的查询结果,在Hibernate中HQL查询同样对子查询功能提供了支持. 如下面代码所示: List list=session.createQuery("from Customer c where 1<(select count(o) from c.orders o)").list(); 上面的程序查询订单数超过1的所有客户,因此和上面子查询HQL语句对应的SQL语句为: Select * from

Hibernate 笔记 HQL查询 条件查询,聚集函数,子查询,导航查询

本笔记继续使用dept部门表,emp员工表,一对多多对一双向映射. 1 条件查询 1.1    查询 员工表emp中 年龄eage小于30,月薪esal大于20000的员工姓名ename sql:select ename from emp where eage<? and esal >?; hql: select ename from Emp where eage<? and esal >? 1.2 问号的设置与别名 问号(?)的设置使用.setParameter(位置, 属性值)

在SQL Server中为什么不建议使用Not In子查询

原文:在SQL Server中为什么不建议使用Not In子查询     在SQL Server中,子查询可以分为相关子查询和无关子查询,对于无关子查询来说,Not In子句比较常见,但Not In潜在会带来下面两种问题: 结果不准确 查询性能低下       下面我们来看一下为什么尽量不使用Not In子句.   结果不准确问题     在SQL Server中,Null值并不是一个值,而是表示特定含义,其所表示的含义是"Unknow",可以理解为未定义或者未知,因此任何与Null值

SQL编程之高级查询(子查询)以及注意事项

1.什么是子查询? 当一个查询是另一个查询的条件时,称之为子查询.子查询可以使用几个简单命令构造功能强大的复合命令.子查询最常用于SELECT-SQL命令的WHERE子句中.子查询是一个 SELECT 语句,它嵌套在一个 SELECT.SELECT...INTO 语句.INSERT...INTO 语句.DELETE 语句.或 UPDATE 语句或嵌套在另一子查询中. 语法:select ....from  表1  where  列1  > (子查询) 外面的查询成为父查询,圆括号嵌入的查询成为称