hibernate将hql转换成count(*)的方法,支持所有的数据库oracle,mysql等
2013-11-07 09:37
519 查看
protected String prepareCountHql(String hql) { //String sql = "select b.id, b.user_name, b.create_date from users b "; //ParameterMetadata parameterMetadata = getQueryPlanCache().getSQLParameterMetadata(sql); // NativeSQLQuerySpecification spec = new NativeSQLQuerySpecification(); // getQueryPlanCache().getNativeSQLQueryPlan(spec); //SQLQuery sqlQuery = createSqlQuery(sql, User.class); // System.out.println(Arrays.toString(sqlQuery.getReturnAliases())); // System.out.println(Arrays.toString(sqlQuery.getReturnTypes())); //Object objects = sqlQuery.list(); // getCountSql(hql, sessionFactory); String fromHql = hql; fromHql = "from" + StringUtils.substringAfter(fromHql, "from"); fromHql = StringUtils.substringBefore(fromHql, "order by"); int whereIndex = fromHql.indexOf("where"); int leftIndex = fromHql.indexOf("left join"); if (leftIndex >= 0) { if (whereIndex >= 0) { String temp = StringUtils.substringBefore(fromHql, "left"); fromHql = temp + " where " + StringUtils.substringAfter(fromHql, "where"); } else { fromHql = StringUtils.substringBefore(fromHql, "left"); } } String countHql = "select count(*) " + fromHql; return countHql; } protected String getCountSql(String originalHql, SessionFactory sessionFactory) { //long d = System.nanoTime(); SessionFactoryImplementor sessionFactoryImplementor = (SessionFactoryImplementor) sessionFactory; HQLQueryPlan hqlQueryPlan = sessionFactoryImplementor.getQueryPlanCache().getHQLQueryPlan(originalHql, false, Collections.emptyMap()); String[] sqls = hqlQueryPlan.getSqlStrings(); //System.out.println(Arrays.toString(sqls)); // System.out.println(Arrays.toString(hqlQueryPlan.getReturnMetadata() // .getReturnAliases())); // System.out.println(Arrays.toString(hqlQueryPlan.getReturnMetadata() // .getReturnTypes())); // QueryTranslatorImpl queryTranslator = new // QueryTranslatorImpl(originalHql, originalHql, Collections.emptyMap(), // sessionFactoryImplementor); // // //org.hibernate.hql.internal.ast.QueryTranslatorImpl queryTranslator2 // = new org.hibernate.hql.internal.ast.QueryTranslatorImpl(originalHql, // originalHql, Collections.emptyMap(), sessionFactoryImplementor); // // queryTranslator.compile(Collections.EMPTY_MAP, false); // String countSql = "select count(*) from (" + // queryTranslator.getSQLString() + ") tmp_count_t"; String countSql = "select count(*) from (" + sqls[0] + ") count"; //System.out.println(System.nanoTime() - d); return countSql; } public SessionFactoryImplementor getSessionFactoryImplementor() { return (SessionFactoryImplementor) getSessionFactory(); } public QueryPlanCache getQueryPlanCache() { return getSessionFactoryImplementor().getQueryPlanCache(); } public HQLQueryPlan getHqlQueryPlan(String hql) { return getQueryPlanCache().getHQLQueryPlan(hql, false, Collections.emptyMap()); } protected String prepareCountSql(String sql) { // String fromSql = sql; // fromSql = "from" + StringUtils.substringAfter(fromSql, "from"); // fromSql = StringUtils.substringBefore(fromSql, "order by"); // String countSql = "select count(*) count " + fromSql; // return countSql; return getCountSql(sql, getSessionFactory()); }
相关文章推荐
- Hibernate的HQL支持数据库convert函数_MySQL
- tigercode是一款自动代码生产工具,支持springmvc+spring+mybatis或springmvc+spring+hibernate框架生成,数据库支持mysql ,oracle
- 数据库迁移之从oracle 到 MySQL最简单的方法
- 解决方法总结:服务器不支持 MySql 数据库,无法安装论坛程序
- hibernate将hql转换成count(*)
- mysql连接数据库的三种方法(连接池,jdbc,Hibernate)
- pd连接数据库生成pd图/各种数据库相互转换(以oracle->mysql为例)/导出成各种数据库脚本
- 在Hibernate工程中如何让数据库从MYSQL换成ORACLE
- mysql、sqlserver、db2、oracle、hsql数据库获取数据库连接方法及分页函数
- pd连接数据库生成pd图/各种数据库相互转换(以oracle->mysql为例)/导出成各种数据库脚本
- [ASP.NET教程] AliasDB:简单统一灵活的数据库访问库(支持MSSQL/MySQL/SQLite/Oracle/ODBC/OleDb)适用于中小型系统
- 【Hibernate】Hibernate的在Eclipse+Mysql的配置、安装,纯Java,利用Annotation与HQL完成数据库的增删改查
- mysql自动定时备份数据库的最佳方法-支持windows系统
- 数据库(oracle、mysql)中的count(*)和count(列名)的区别
- oracle mysql sqlserver 查看当前所有数据库及数据库基本操作命令
- MySQL通过以下方法查询当前数据库支持的存储引擎
- PHP列出MySQL中所有数据库的方法
- 转移数据库中所有的表-从oracle到mysql(从mysql到mysql 两台电脑)
- c#下各种数据库操作的封装!(支持ACCESS,SQLSERVER,DB2,ORACLE,MYSQL)2
- oracle to_char()to_date()函数 mysql日期和字符相互转换方法