`
raywithu
  • 浏览: 24730 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

Oracle中(column1,column2..)in(集合/子查询)的hibernate实现

阅读更多

Oracle中可以使用如下的SQL语句

 

SELECT * 
FROM BZ_COMPANY
WHERE( CLN_DATE, COMPNAY_NAME ) IN (
			 SELECT MAX(CLN_DATE),COMPANY_NAME
			 FROM BZ_COMPANY 
			 GROUP BY COMPANY_NAME
);
 

 

 

 

可在hibernate中QBC中应该怎么去写呢

 

QBC的in只能做到如下的实现:

 

DetachedCriteria dc = DetachedCriteria.forClass(BzCompany.class);
dc.setProjection(Projections.projectionList()
		//.add(Projections.max("clnDate"))
		.add(Projections.groupProperty("companyName")));
Criteria criteria = session.createCriteria(BzCompany.class);
criteria.add(Example.create(bean)
		.ignoreCase()
		.enableLike(MatchMode.ANYWHERE))
.add(Subqueries.propertyIn("companyName", dc));
 

 

 

propertyIn的属性参数只支持单属性,编写MySubqueries,重载propertyIn方法的一个实现,让它支持多属性。

这里涉及两个类:

 

1、对应于Subqueries的MySubqueries:

 

package util;

import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Subqueries;

public class MySubqueries extends Subqueries {

	public static Criterion propertyIn(String[] propertyNames, DetachedCriteria dc) {
		return new MySubqueryExpression(propertyNames, "in", null, dc);
	}
}

 2、对应于SubqueryExpression的MySubqueryExpression:

 

package util;

import org.hibernate.Criteria;
import org.hibernate.criterion.CriteriaQuery;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.SubqueryExpression;
import org.hibernate.util.StringHelper;

public class MySubqueryExpression extends SubqueryExpression {

	private String[] propertyNames;

	protected MySubqueryExpression(String[] propertyNames, String op, String quantifier, DetachedCriteria dc) {
		super(op, quantifier, dc);
		this.propertyNames = propertyNames;
	}

	protected String toLeftSqlString(Criteria criteria, CriteriaQuery criteriaQuery) {
		String[] columns = new String[propertyNames.length];
		for (int i = 0; i < propertyNames.length; i++) {
			columns[i] = criteriaQuery.getColumn(criteria, propertyNames[i]);
		}
		return "(" + StringHelper.join(", ", columns) + ")";
	}

}
 

使用例子:

 

DetachedCriteria dc = DetachedCriteria.forClass(BzCompany.class);
dc.setProjection(Projections.projectionList()
		.add(Projections.max("clnDate"))
		.add(Projections.groupProperty("companyName")));
Criteria criteria = session.createCriteria(BzCompany.class);
criteria.add(Example.create(bean)
		.ignoreCase()
		.enableLike(MatchMode.ANYWHERE))
.add(MySubqueries.propertyIn(new String[]{"clnDate","companyName"}, dc));

 

不过这是in(子查询)的实现,in(集合)是使用Restrictions

但奇怪的是Restrictions并不允许继承,构造函数没公开~~

如果要实现,继承就做不了的,但还是通过类似的手段实现目的。

http://raywithu.iteye.com/admin/blogs/1139511

0
1
分享到:
评论

相关推荐

    oracle分页查询

    Oracle 分页查询详解 ...Oracle 分页查询可以使用 ROWNUM、ROW_NUMBER() 和子查询三种方法来实现,each with its own advantages and disadvantages. 选择哪种方法取决于具体的应用场景和性能要求。

    Hibernate3.2官方中文参考手册.rar

    - 支持复杂查询,如子查询、连接查询、集合查询等。 - 支持CGLIB和JPA规范。 - 支持Hibernate事件监听器,实现对对象生命周期的监控。 总之,《Hibernate 3.2官方中文参考手册》详尽地介绍了Hibernate 3.2的各种...

    SSH+ORACLE通用分页

    在Oracle数据库中,进行分页查询通常涉及SQL的`ROWNUM`或`ROW_NUMBER()`函数,以及子查询或嵌套查询。`ROWNUM`在早期版本的Oracle中被广泛使用,它会为每行数据分配一个唯一的数字,通过与特定范围的比较来获取指定...

    Hibernate课程的总结

    1. 避免过多的HQL子查询,优化查询结构。 2. 使用预编译的SQL(Query.setParameters())以提高性能。 3. 合理设计实体关系,避免循环引用导致的懒加载问题。 4. 使用事务管理,确保数据一致性。 总结所述,...

    hibernate5.1.10 依赖jar包

    它可以执行更复杂的查询,例如关联查询、聚合函数、子查询等。 **7. Hibernate事务处理** 在Hibernate中,可以通过Session的beginTransaction()、commit()和rollback()方法管理事务。事务是数据库操作的基本单元,...

    oracle-jdbc分页实现(只需传入sql语句即可实现分页)

    在SQL查询中,我们可以结合子查询来实现分页。例如,要获取第5页的数据,每页显示10条记录,可以这样写: ```sql SELECT * FROM ( SELECT a.*, ROWNUM rnum FROM ( SELECT * FROM your_table ) a ) WHERE rnum ...

    DB2 与ORACLE的比对.docx

    - ORACLE 支持子查询别名,如 `t`,而 DB2 也支持,但需要使用 `as` 关键字来声明别名,或者直接跟别名,如 `select * from (select 1 from sysibm.sysdummy1) t`。 5. **DATE 数据类型**: - ORACLE 的 DATE ...

    Oracle的SQL分页实践

    为了解决这个问题,Oracle 10g引入了新的功能:ROW_NUMBER()函数,配合子查询和WITH子句(即CTE,公共表表达式)可以实现更高效的分页: ```sql WITH ordered_data AS ( SELECT t.*, ROW_NUMBER() OVER (ORDER BY ...

    MLDN魔乐科技JAVA培训_Oracle课堂18_外键约束.rar

    在这个例子中,`child_table`是子表的名称,`fk_constraint_name`是你为外键约束自定义的名称,`child_column`是子表中引用父表主键的列,`parent_table`是父表的名称,而`parent_column`是父表的主键列。...

    精通Hibernate

    1. Configuration:配置类,负责读取hibernate.cfg.xml配置文件,初始化SessionFactory。 2. SessionFactory:会话工厂,负责创建Session对象,它是线程不安全的,通常在应用启动时创建并全局共享。 3. Session:...

    -oracle(学生).pdf

    1. Oracle 数据库系统允许对表的列添加注释,以提供元数据信息。在给定的选项中,正确的方式是 B) `COMMENT ON COLUMN CUSTOMER.CUSTOMER_NAME IS '客户姓名';` 这条语句会在 Customer 表的 Customer_name 列上添加...

    -oracle(学生).docx

    在Oracle中,正确的方法是使用`COMMENT ON COLUMN`语句,因此正确答案是B) `COMMENT ON COLUMN CUSTOMER.CUSTOMER_NAME IS '客户姓名';` 这条语句会在`Customer_name`列上添加注释“客户姓名”。 2. 删除角色通常...

    精通hibernate

    支持复杂的查询,如连接、子查询、聚合函数等。 十一、Criteria API Criteria API提供了一种更面向对象的方式来构建查询,与HQL相比,更动态且易于代码生成。 十二、性能优化 通过批处理、缓存、二级缓存、预加载...

    oracle mysql分页源码

    2. ROWNUM配合子查询:Oracle还允许使用子查询和ROWNUM结合,实现更复杂的分页逻辑。这种方法通常用于处理不连续的行号需求,比如跳过某些行。 MySQL 分页: 1. LIMIT关键字:MySQL 提供了LIMIT子句来实现分页,其...

    Hibernate开发指南

    4. **优化HQL查询**: 避免在HQL中使用子查询,减少JOIN操作,提高查询效率。 综上所述,理解并掌握Hibernate的基本概念和使用技巧,对于Java开发人员来说,能极大地提升数据库操作的效率,使项目开发更加顺畅。在...

    Java实现分页查询

    例如,在Oracle中,可以使用子查询和`ROWNUM`限制返回的行数。 ```sql SELECT * FROM ( SELECT T.*, ROWNUM RN FROM (SELECT * FROM YOUR_TABLE ORDER BY YOUR_SORT_COLUMN) T ) WHERE RN BETWEEN (your_page_...

    orcl数据库分页源码通过数据库实现分页

    这里的子查询`SELECT * FROM your_table`获取所有数据,外层查询则添加了ROWNUM限制,以实现分页。 2. ROW_NUMBER()函数:在Oracle 11g中引入,这种方法更加灵活,可以配合PARTITION BY子句进行分区排序。基本语法...

    oracle,weblogic读写blob

    在 SQL 查询中,你可以使用 `SELECT BLOB_COLUMN FROM TABLE` 来读取 BLOB 数据,并通过 PL/SQL 包如 `UTL_FILE` 或 `DBMS_LOB` 来进行写入和更新。`DBMS_LOB` 提供了一系列的子程序,如 `DBMS_LOB.CREATETEMPORARY`...

Global site tag (gtag.js) - Google Analytics