hibernate是否支持count(*)over()
我试图阻止必须为count创建一个单独的查询,为实际查询创建一个查询。 我发现SesssionImpl :: createQuery需要相当长的时间来进行复杂的查询,通过组合count和主查询,我可以消除一个createQuery调用。
在SQL中我可以做类似的事情
select count(*) over(), col_A, col_B from TABLE_XX where col_C > 1000
这可以在hibernate中实现吗?
(我试图避免使用本机sql并坚持使用HQL和分离标准。使用本机SQL会破坏使用hibernate的目的。我的系统必须同时支持Oracle和Sybase)
Hibernate的@Formula
注释可以作为一种解决方法。 在@Entity
提供一个额外的列来表示计数,用@Formula
注释,其中包含COUNT OVER
查询:
@Formula("count(*) over ()") private Integer totalResults;
但是,使用这种方法,Hibernate会对生成的SQL进行一些屠杀,因此您可能还需要注册一个Interceptor
来清理SQL:
public class CountOverQueryInterceptor extends EmptyInterceptor { private static final long serialVersionUID = -2980622815729060717L; @Override public String onPrepareStatement(String sql) { return super.onPrepareStatement(cleanCountOver(sql)); } /** * Cleans the "{@code count(*) over ()}" query fragment from Hibernate's sql * decoration "{@code count(*) .over ()}". */ static String cleanCountOver(String sql) { return sql.replaceAll("(?i) (count)\\(\\*\\) \\w+\\.(over) \\(\\)", " $1(*) $2 () "); } }
除了明确的Hibernate依赖(而不是纯JPA)之外,还有另一个缺点,即默认情况下将加载此列,这可能会为不需要计数的查询添加一些不必要的开销。 有可能使列可选并且延迟加载 ,但这需要字节码检测并增加了更复杂的层。
@Formula("count(*) over ()") @Basic(optional = true, fetch = FetchType.LAZY) private Integer totalResults;
您可以将此用于: –
return (Number) session.createCriteria("Book").setProjection(Projections.rowCount()).uniqueResult();
- Hibernate Bi-Directional多对多关联创建重复
- Hibernate Criteria API – 添加标准:字符串应该在集合中
- API或代码:Hibernate 3和4之间的区别?
- 什么是与Hibernate和JDBC相关的对象/关系映射(ORM)?
- 使用Hibernate通过SSH隧道获取数据
- 创建名为’sessionFactory’的bean时出错:MalformedParameterizedTypeException
- Hibernate计算具有一些标准的行
- Hibernate ManyToMany是否可以为非键列自连接? 获取mappingException
- 使用jpa和hibernate在orm.xml中定义命名查询