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并不允许继承,构造函数没公开~~
如果要实现,继承就做不了的,但还是通过类似的手段实现目的。
相关推荐
Oracle 分页查询详解 ...Oracle 分页查询可以使用 ROWNUM、ROW_NUMBER() 和子查询三种方法来实现,each with its own advantages and disadvantages. 选择哪种方法取决于具体的应用场景和性能要求。
- 支持复杂查询,如子查询、连接查询、集合查询等。 - 支持CGLIB和JPA规范。 - 支持Hibernate事件监听器,实现对对象生命周期的监控。 总之,《Hibernate 3.2官方中文参考手册》详尽地介绍了Hibernate 3.2的各种...
在Oracle数据库中,进行分页查询通常涉及SQL的`ROWNUM`或`ROW_NUMBER()`函数,以及子查询或嵌套查询。`ROWNUM`在早期版本的Oracle中被广泛使用,它会为每行数据分配一个唯一的数字,通过与特定范围的比较来获取指定...
1. 避免过多的HQL子查询,优化查询结构。 2. 使用预编译的SQL(Query.setParameters())以提高性能。 3. 合理设计实体关系,避免循环引用导致的懒加载问题。 4. 使用事务管理,确保数据一致性。 总结所述,...
它可以执行更复杂的查询,例如关联查询、聚合函数、子查询等。 **7. Hibernate事务处理** 在Hibernate中,可以通过Session的beginTransaction()、commit()和rollback()方法管理事务。事务是数据库操作的基本单元,...
在SQL查询中,我们可以结合子查询来实现分页。例如,要获取第5页的数据,每页显示10条记录,可以这样写: ```sql SELECT * FROM ( SELECT a.*, ROWNUM rnum FROM ( SELECT * FROM your_table ) a ) WHERE rnum ...
- ORACLE 支持子查询别名,如 `t`,而 DB2 也支持,但需要使用 `as` 关键字来声明别名,或者直接跟别名,如 `select * from (select 1 from sysibm.sysdummy1) t`。 5. **DATE 数据类型**: - ORACLE 的 DATE ...
为了解决这个问题,Oracle 10g引入了新的功能:ROW_NUMBER()函数,配合子查询和WITH子句(即CTE,公共表表达式)可以实现更高效的分页: ```sql WITH ordered_data AS ( SELECT t.*, ROW_NUMBER() OVER (ORDER BY ...
在这个例子中,`child_table`是子表的名称,`fk_constraint_name`是你为外键约束自定义的名称,`child_column`是子表中引用父表主键的列,`parent_table`是父表的名称,而`parent_column`是父表的主键列。...
1. Configuration:配置类,负责读取hibernate.cfg.xml配置文件,初始化SessionFactory。 2. SessionFactory:会话工厂,负责创建Session对象,它是线程不安全的,通常在应用启动时创建并全局共享。 3. Session:...
1. Oracle 数据库系统允许对表的列添加注释,以提供元数据信息。在给定的选项中,正确的方式是 B) `COMMENT ON COLUMN CUSTOMER.CUSTOMER_NAME IS '客户姓名';` 这条语句会在 Customer 表的 Customer_name 列上添加...
在Oracle中,正确的方法是使用`COMMENT ON COLUMN`语句,因此正确答案是B) `COMMENT ON COLUMN CUSTOMER.CUSTOMER_NAME IS '客户姓名';` 这条语句会在`Customer_name`列上添加注释“客户姓名”。 2. 删除角色通常...
支持复杂的查询,如连接、子查询、聚合函数等。 十一、Criteria API Criteria API提供了一种更面向对象的方式来构建查询,与HQL相比,更动态且易于代码生成。 十二、性能优化 通过批处理、缓存、二级缓存、预加载...
2. ROWNUM配合子查询:Oracle还允许使用子查询和ROWNUM结合,实现更复杂的分页逻辑。这种方法通常用于处理不连续的行号需求,比如跳过某些行。 MySQL 分页: 1. LIMIT关键字:MySQL 提供了LIMIT子句来实现分页,其...
4. **优化HQL查询**: 避免在HQL中使用子查询,减少JOIN操作,提高查询效率。 综上所述,理解并掌握Hibernate的基本概念和使用技巧,对于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_...
这里的子查询`SELECT * FROM your_table`获取所有数据,外层查询则添加了ROWNUM限制,以实现分页。 2. ROW_NUMBER()函数:在Oracle 11g中引入,这种方法更加灵活,可以配合PARTITION BY子句进行分区排序。基本语法...
在 SQL 查询中,你可以使用 `SELECT BLOB_COLUMN FROM TABLE` 来读取 BLOB 数据,并通过 PL/SQL 包如 `UTL_FILE` 或 `DBMS_LOB` 来进行写入和更新。`DBMS_LOB` 提供了一系列的子程序,如 `DBMS_LOB.CREATETEMPORARY`...